/******************************************************************************* * Copyright 2013 * Ubiquitous Knowledge Processing (UKP) Lab * Technische Universität Darmstadt * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. ******************************************************************************/ package de.tudarmstadt.ukp.csniper.webapp.statistics; import static java.util.Arrays.asList; import static org.junit.Assert.assertEquals; import java.util.ArrayList; import java.util.Arrays; import java.util.HashMap; import java.util.Iterator; import java.util.List; import java.util.Map; import javax.annotation.Resource; import org.apache.wicket.spring.injection.annot.SpringBean; import org.junit.Ignore; import org.junit.Test; import org.junit.runner.RunWith; import org.springframework.test.context.ContextConfiguration; import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; import de.tudarmstadt.ukp.csniper.webapp.evaluation.EvaluationRepository; import de.tudarmstadt.ukp.csniper.webapp.evaluation.model.EvaluationItem; import de.tudarmstadt.ukp.csniper.webapp.evaluation.model.EvaluationResult; import de.tudarmstadt.ukp.csniper.webapp.project.model.AnnotationType; import de.tudarmstadt.ukp.csniper.webapp.statistics.SortableAggregatedEvaluationResultDataProvider.ResultFilter; import de.tudarmstadt.ukp.csniper.webapp.statistics.model.AggregatedEvaluationResult; @RunWith(SpringJUnit4ClassRunner.class) @ContextConfiguration("file:src/main/webapp/WEB-INF/databaseContextTest.xml") public class ListAggregatedTest { private final static String CORRECT = "Correct"; private final static String WRONG = "Wrong"; private final static String EMPTY = ""; @Resource(name = "evaluationRepository") @SpringBean(name = "evaluationRepository") private EvaluationRepository service; private SortableAggregatedEvaluationResultDataProvider dataProvider; private List<String> collectionIds; private List<AnnotationType> types; private List<String> users; private double userThreshold = 0; private double confidenceThreshold = 0; /** * C, W, D, I, U */ private int[] expectedResults; /** * userRatio, confidence */ private List<double[]> expectedRatios; private boolean started; @Ignore("Ignore until we find a way to test the mysql stuff on jenkins.") @Test public void tests() { setupResults(); collectionIds = asList("c1"); types = asList(new AnnotationType("t3")); users = asList("user1"); expectedResults = new int[] { 1, 0, 0, 0, 0 }; expectedRatios = Arrays.asList(new double[] { 1, 1 }); testIndividualResults(); testRatios(); collectionIds = asList("c1"); types = asList(new AnnotationType("t1"), new AnnotationType("t3")); users = asList("user1", "user3"); expectedResults = new int[] { 1, 0, 1, 0, 0 }; expectedRatios = Arrays.asList(new double[] { 1, 0 }, new double[] { 1, 1 }); testIndividualResults(); testRatios(); collectionIds = asList("c2", "c3"); types = asList(new AnnotationType("t3")); users = asList("user1", "user2"); expectedResults = new int[] { 0, 0, 2, 0, 0 }; expectedRatios = Arrays.asList(new double[] { 1, 0 }, new double[] { 1, 0 }); testIndividualResults(); testRatios(); collectionIds = asList("c1"); types = asList(new AnnotationType("t1"), new AnnotationType("t3")); users = asList("user3", "user4"); expectedResults = new int[] { 1, 1, 0, 0, 0 }; expectedRatios = Arrays.asList(new double[] { 1, 1 }, new double[] { 0.5, 1 }); testIndividualResults(); testRatios(); collectionIds = asList("c1", "c2", "c3"); types = asList(new AnnotationType("t1"), new AnnotationType("t3")); users = asList("user1", "user2", "user3", "user4"); expectedResults = new int[] { 2, 0, 2, 0, 0 }; expectedRatios = Arrays.asList(new double[] { 1, 0 }, new double[] { 0.75, 1 }, new double[] { 1, 0.666 }, new double[] { 1, 0 }); testIndividualResults(); testRatios(); } /** * Test the classification of each {@link AggregatedEvaluationResult} which is returned. */ public void testIndividualResults() { List<AggregatedEvaluationResult> agg = service.listAggregatedResults(collectionIds, types, users, userThreshold, confidenceThreshold); dataProvider = new SortableAggregatedEvaluationResultDataProvider(agg, users); Map<ResultFilter, Integer> actuals = dataProvider.getClassifications(); Map<ResultFilter, Integer> expected = new HashMap<ResultFilter, Integer>(); expected.put(ResultFilter.CORRECT, expectedResults[0]); expected.put(ResultFilter.WRONG, expectedResults[1]); expected.put(ResultFilter.DISPUTED, expectedResults[2]); expected.put(ResultFilter.INCOMPLETE, expectedResults[3]); expected.put(ResultFilter.UNKNOWN, expectedResults[4]); assertEquals(expected.size(), actuals.size()); for (ResultFilter filter : ResultFilter.values()) { assertEquals(expected.get(filter), actuals.get(filter)); } } /** * Test user ratio and confidence of the {@link AggregatedEvaluationResult}s in question. */ public void testRatios() { List<AggregatedEvaluationResult> agg = service.listAggregatedResults(collectionIds, types, users, userThreshold, confidenceThreshold); Iterator<double[]> it = expectedRatios.iterator(); for (AggregatedEvaluationResult aer : agg) { double[] ratios = it.next(); assertEquals(ratios[0], aer.getUserRatio(), 0.001); assertEquals(ratios[1], aer.getConfidence(), 0.001); } } public void setupResults() { if (started) { return; } else { started = true; } List<EvaluationItem> items = new ArrayList<EvaluationItem>(); List<EvaluationResult> results = new ArrayList<EvaluationResult>(); items.add(new EvaluationItem("c1", "Doc1", "t1", 0, 1, "text1")); results.add(new EvaluationResult(items.get(0), "user1", CORRECT)); results.add(new EvaluationResult(items.get(0), "user2", CORRECT)); results.add(new EvaluationResult(items.get(0), "user3", WRONG)); results.add(new EvaluationResult(items.get(0), "user4", WRONG)); items.add(new EvaluationItem("c1", "Doc2", "t3", 0, 1, "text2")); results.add(new EvaluationResult(items.get(1), "user1", CORRECT)); results.add(new EvaluationResult(items.get(1), "user2", CORRECT)); results.add(new EvaluationResult(items.get(1), "user3", CORRECT)); results.add(new EvaluationResult(items.get(1), "user4", EMPTY)); items.add(new EvaluationItem("c2", "Doc3", "t3", 0, 1, "text3")); results.add(new EvaluationResult(items.get(2), "user1", CORRECT)); results.add(new EvaluationResult(items.get(2), "user2", WRONG)); results.add(new EvaluationResult(items.get(2), "user3", CORRECT)); results.add(new EvaluationResult(items.get(2), "user4", CORRECT)); items.add(new EvaluationItem("c3", "Doc4", "t3", 0, 1, "text4")); results.add(new EvaluationResult(items.get(3), "user1", CORRECT)); results.add(new EvaluationResult(items.get(3), "user2", WRONG)); results.add(new EvaluationResult(items.get(3), "user3", CORRECT)); results.add(new EvaluationResult(items.get(3), "user4", WRONG)); items = service.writeEvaluationItems(items); service.writeEvaluationResults(results); } }