/** * Licensed to the Apache Software Foundation (ASF) under one or more * contributor license agreements. See the NOTICE file distributed with * this work for additional information regarding copyright ownership. * The ASF licenses this file to You 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 org.apache.mahout.ga.watchmaker.cd.hadoop; import org.apache.hadoop.io.LongWritable; import org.apache.mahout.examples.MahoutTestCase; import org.apache.mahout.ga.watchmaker.cd.CDFitness; import org.apache.mahout.ga.watchmaker.cd.DataLine; import org.apache.mahout.ga.watchmaker.cd.Rule; import org.apache.mahout.common.DummyOutputCollector; import org.easymock.EasyMock; import org.junit.Before; import org.junit.Test; import java.util.Arrays; import java.util.List; import java.util.Set; public final class CDMapperTest extends MahoutTestCase { private DataLine dl; private Rule rule; private final CDFitness TP = new CDFitness(1, 0, 0, 0); private final CDFitness FP = new CDFitness(0, 1, 0, 0); private final CDFitness TN = new CDFitness(0, 0, 1, 0); private final CDFitness FN = new CDFitness(0, 0, 0, 1); @Override @Before public void setUp() throws Exception { super.setUp(); // we assume 2 classes 0 and 1 // their are 4 tests // TP: dataline label 1, rule returns 1 // FP: dataline label 0, rule returns 1 // TN: dataline label 0, rule returns 0 // FN: dataline label 1, rule returns 0 dl = EasyMock.createMock(DataLine.class); EasyMock.expect(dl.getLabel()).andReturn(1); EasyMock.expect(dl.getLabel()).andReturn(0); EasyMock.expect(dl.getLabel()).andReturn(0); EasyMock.expect(dl.getLabel()).andReturn(1); rule = EasyMock.createMock(Rule.class); EasyMock.expect(rule.classify(dl)).andReturn(1); EasyMock.expect(rule.classify(dl)).andReturn(1); EasyMock.expect(rule.classify(dl)).andReturn(0); EasyMock.expect(rule.classify(dl)).andReturn(0); } public void testEvaluate() { // test the evaluation assertEquals(TP, CDMapper.evaluate(1, 1, 1)); assertEquals(FP, CDMapper.evaluate(1, 1, 0)); assertEquals(TN, CDMapper.evaluate(1, 0, 0)); assertEquals(FN, CDMapper.evaluate(1, 0, 1)); } @Test public void testMap() throws Exception { EasyMock.replay(rule); EasyMock.replay(dl); // create and configure the mapper CDMapper mapper = new CDMapper(); List<Rule> rules = Arrays.asList(rule, rule, rule, rule); mapper.configure(rules, 1); // test the mapper DummyOutputCollector<LongWritable, CDFitness> collector = new DummyOutputCollector<LongWritable, CDFitness>(); for (int index1 = 0; index1 < mapper.getRules().size(); index1++) { CDFitness eval1 = CDMapper.evaluate(mapper.getTarget(), mapper.getRules().get(index1).classify(dl), dl.getLabel()); collector.collect(new LongWritable(index1), eval1); } // check the evaluations Set<LongWritable> keys = collector.getKeys(); assertEquals("Number of evaluations", rules.size(), keys.size()); CDFitness[] expected = {TP, FP, TN, FN}; for (LongWritable key : keys) { int index = (int) key.get(); assertEquals("Values for key " + key, 1, collector.getValue(key).size()); CDFitness eval = collector.getValue(key).get(0); assertEquals("Evaluation of the rule " + key, expected[index], eval); } EasyMock.verify(rule); EasyMock.verify(dl); } }