summaryrefslogtreecommitdiff
path: root/src/core/JUTests/data/io/filters/MVDataCombinerTest.java
blob: 5d32dd80764b9321cd2f03f573f8e7318538b1cc (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
package data.io.filters;

import static org.junit.Assert.*;

import java.util.Iterator;

import org.junit.Rule;
import org.junit.Test;
import org.junit.rules.ExpectedException;

import data.MVDataEntry;
import data.filters.MVDataCombiner;
import data.filters.MVDataCombiner.MVDataCombineMode;
import data.io.MVDataReader;
import data.io.stub.StubDataReader;

public class MVDataCombinerTest {
	
	@Rule
	public ExpectedException exception = ExpectedException.none();
	
	@Test
	public void testOutOfOrderCase() {
		// Test Data
		MVDataEntry e10 = new MVDataEntry("line2");
		e10.getAttrValPairs().put("merge", "e10");
		MVDataEntry e11 = new MVDataEntry("line1");
		e11.getAttrValPairs().put("merge", "e11");
		
		MVDataEntry e21 = new MVDataEntry("line2");
		e21.getAttrValPairs().put("merge", "e21");

		MVDataEntry[][] fakeEntries = new MVDataEntry[][] {
				new MVDataEntry[] { e10, e11 },
				new MVDataEntry[] { e21 },
		};

		MVDataCombineMode mergeModes[] = new MVDataCombineMode[]{
				MVDataCombineMode.PRIMARY_SOURCE,
				MVDataCombineMode.MERGE_APPEND,
		};
		
		// Expected results
		MVDataEntry line1 = new MVDataEntry(e10);
		line1.mergeValues(true, e21);
		
		MVDataEntry expected[] = new MVDataEntry[] {
				line1,
				null /* Should throw UnsupportedOperationException() before comparing */
		};
		
		// Test run
		exception.expect(UnsupportedOperationException.class);
		doCombineTest(expected, fakeEntries, mergeModes);
	}
	

	@Test
	public void testGeneralCase() {
		
		// Test Data
		MVDataEntry e10 = new MVDataEntry("line3");
		e10.getAttrValPairs().put("from1", "e10");
		e10.getAttrValPairs().put("merge", "e10");
		MVDataEntry e11 = new MVDataEntry("line4");
		e11.getAttrValPairs().put("from1", "e11");
		e11.getAttrValPairs().put("merge", "e11");
		
		MVDataEntry e20 = new MVDataEntry("line1");
		e20.getAttrValPairs().put("from2", "e20");
		e20.getAttrValPairs().put("merge", "e20");
		MVDataEntry e21 = new MVDataEntry("line2");
		e21.getAttrValPairs().put("from2", "e21");
		e21.getAttrValPairs().put("merge", "e21");
		MVDataEntry e22 = new MVDataEntry("line3");
		e22.getAttrValPairs().put("from2", "e22");
		e22.getAttrValPairs().put("merge", "e22");
		
		MVDataEntry e30 = new MVDataEntry("line2");
		e30.getAttrValPairs().put("from3", "e30");
		e30.getAttrValPairs().put("merge", "e30");
		
		
		MVDataEntry[][] fakeEntries = new MVDataEntry[][] {
				new MVDataEntry[] { e10, e11 },
				new MVDataEntry[] { e20, e21, e22 },
				new MVDataEntry[] { e30 },
		};
		
		MVDataCombineMode mergeModes[] = new MVDataCombineMode[]{
				MVDataCombineMode.PRIMARY_SOURCE,
				MVDataCombineMode.MERGE_REPLACE,
				MVDataCombineMode.MERGE_APPEND,
		};
		
		// Expected results
		MVDataEntry line1 = new MVDataEntry(e20);
		
		MVDataEntry line2 = new MVDataEntry(e21);
		line2.mergeValues(true, e30);
		
		MVDataEntry line3 = new MVDataEntry(e10);
		line3.mergeValues(false, e22);
		
		MVDataEntry line4 = new MVDataEntry(e11);
		
		MVDataEntry expected[] = new MVDataEntry[] {
				line1,line2,line3,line4
		};
		
		// Test run
		doCombineTest(expected, fakeEntries, mergeModes);
	}

	// TODO : test all Combine modes

	/**
	 * Helper function to factorise Combiner tests.
	 * @param expected
	 * @param fakeEntries
	 * @param mergeModes
	 */
	public void doCombineTest(MVDataEntry expected[], MVDataEntry[][] fakeEntries, MVDataCombineMode mergeModes[]) {
		// Test init		
		MVDataReader readers[] = new MVDataReader[fakeEntries.length];
		for (int i = 0; i < fakeEntries.length; i++) {
			readers[i] = new StubDataReader("fakeReader"+i,fakeEntries[i]);
		}

		MVDataCombiner combiner = new MVDataCombiner("combiner", readers, mergeModes);
		
		// Test twice to check if asking a new iterator "rewinds" correctly
		for (int i=0;i<2;i++) {
			//System.out.println("Loop " + (i+1));
			
			Iterator<MVDataEntry> combinerIt = combiner.iterator();
			for (int j = 0; j < expected.length; j++) {
				assertTrue(combinerIt.hasNext());
				MVDataEntry item = combinerIt.next();
				//System.out.println(expected[i]);
				//System.out.println(item);
				//System.out.println();
				assertEquals(expected[j], item);
			}
			assertFalse(combinerIt.hasNext());
		}
	}
}