1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23 package org.hipparchus.util;
24
25 import org.hipparchus.exception.MathIllegalArgumentException;
26 import org.junit.jupiter.api.Test;
27
28 import java.util.NoSuchElementException;
29
30 import static org.junit.jupiter.api.Assertions.assertEquals;
31 import static org.junit.jupiter.api.Assertions.assertFalse;
32 import static org.junit.jupiter.api.Assertions.assertThrows;
33 import static org.junit.jupiter.api.Assertions.assertTrue;
34 import static org.junit.jupiter.api.Assertions.fail;
35
36
37
38
39 class MultidimensionalCounterTest {
40 @Test
41 void testPreconditions() {
42 MultidimensionalCounter c;
43
44 try {
45 c = new MultidimensionalCounter(0, 1);
46 fail("MathIllegalArgumentException expected");
47 } catch (MathIllegalArgumentException e) {
48
49 }
50 try {
51 c = new MultidimensionalCounter(2, 0);
52 fail("MathIllegalArgumentException expected");
53 } catch (MathIllegalArgumentException e) {
54
55 }
56 try {
57 c = new MultidimensionalCounter(-1, 1);
58 fail("MathIllegalArgumentException expected");
59 } catch (MathIllegalArgumentException e) {
60
61 }
62
63 c = new MultidimensionalCounter(2, 3);
64 try {
65 c.getCount(1, 1, 1);
66 fail("MathIllegalArgumentException expected");
67 } catch (MathIllegalArgumentException e) {
68
69 }
70 try {
71 c.getCount(3, 1);
72 fail("MathIllegalArgumentException expected");
73 } catch (MathIllegalArgumentException e) {
74
75 }
76 try {
77 c.getCount(0, -1);
78 fail("MathIllegalArgumentException expected");
79 } catch (MathIllegalArgumentException e) {
80
81 }
82 try {
83 c.getCounts(-1);
84 fail("MathIllegalArgumentException expected");
85 } catch (MathIllegalArgumentException e) {
86
87 }
88 try {
89 c.getCounts(6);
90 fail("MathIllegalArgumentException expected");
91 } catch (MathIllegalArgumentException e) {
92
93 }
94 }
95
96 @Test
97 void testIteratorPreconditions() {
98 MultidimensionalCounter.Iterator iter = (new MultidimensionalCounter(2, 3)).iterator();
99 try {
100 iter.getCount(-1);
101 fail("IndexOutOfBoundsException expected");
102 } catch (IndexOutOfBoundsException e) {
103
104 }
105 try {
106 iter.getCount(2);
107 fail("IndexOutOfBoundsException expected");
108 } catch (IndexOutOfBoundsException e) {
109
110 }
111 }
112
113 @Test
114 void testIterator() {
115 final int dim1 = 3;
116 final int dim2 = 4;
117
118 final MultidimensionalCounter.Iterator iter
119 = new MultidimensionalCounter(dim1, dim2).iterator();
120
121 final int max = dim1 * dim2;
122 for (int i = 0; i < max; i++) {
123 assertTrue(iter.hasNext());
124
125
126 iter.next();
127 }
128
129 assertFalse(iter.hasNext());
130 }
131
132 @Test
133 void testIteratorNoMoreElements() {
134 assertThrows(NoSuchElementException.class, () -> {
135 final MultidimensionalCounter.Iterator iter
136 = new MultidimensionalCounter(4, 2).iterator();
137
138 while (iter.hasNext()) {
139 iter.next();
140 }
141
142
143 iter.next();
144 });
145 }
146
147 @Test
148 void testMulti2UniConversion() {
149 final MultidimensionalCounter c = new MultidimensionalCounter(2, 4, 5);
150 assertEquals(33, c.getCount(1, 2, 3));
151 }
152
153 @Test
154 void testAccessors() {
155 final int[] originalSize = new int[] {2, 6, 5};
156 final MultidimensionalCounter c = new MultidimensionalCounter(originalSize);
157 final int nDim = c.getDimension();
158 assertEquals(nDim, originalSize.length);
159
160 final int[] size = c.getSizes();
161 for (int i = 0; i < nDim; i++) {
162 assertEquals(originalSize[i], size[i]);
163 }
164 }
165
166 @Test
167 void testIterationConsistency() {
168 final MultidimensionalCounter c = new MultidimensionalCounter(2, 3, 4);
169 final int[][] expected = new int[][] {
170 { 0, 0, 0 },
171 { 0, 0, 1 },
172 { 0, 0, 2 },
173 { 0, 0, 3 },
174 { 0, 1, 0 },
175 { 0, 1, 1 },
176 { 0, 1, 2 },
177 { 0, 1, 3 },
178 { 0, 2, 0 },
179 { 0, 2, 1 },
180 { 0, 2, 2 },
181 { 0, 2, 3 },
182 { 1, 0, 0 },
183 { 1, 0, 1 },
184 { 1, 0, 2 },
185 { 1, 0, 3 },
186 { 1, 1, 0 },
187 { 1, 1, 1 },
188 { 1, 1, 2 },
189 { 1, 1, 3 },
190 { 1, 2, 0 },
191 { 1, 2, 1 },
192 { 1, 2, 2 },
193 { 1, 2, 3 }
194 };
195
196 final int totalSize = c.getSize();
197 assertEquals(expected.length, totalSize);
198
199 final int nDim = c.getDimension();
200 final MultidimensionalCounter.Iterator iter = c.iterator();
201 for (int i = 0; i < totalSize; i++) {
202 if (!iter.hasNext()) {
203 fail("Too short");
204 }
205 final int uniDimIndex = iter.next().intValue();
206 assertEquals(i, uniDimIndex, "Wrong iteration at " + i);
207
208 for (int dimIndex = 0; dimIndex < nDim; dimIndex++) {
209 assertEquals(expected[i][dimIndex], iter.getCount(dimIndex), "Wrong multidimensional index for [" + i + "][" + dimIndex + "]");
210 }
211
212 assertEquals(c.getCount(expected[i]), uniDimIndex, "Wrong unidimensional index for [" + i + "]");
213
214 final int[] indices = c.getCounts(uniDimIndex);
215 for (int dimIndex = 0; dimIndex < nDim; dimIndex++) {
216 assertEquals(expected[i][dimIndex], indices[dimIndex], "Wrong multidimensional index for [" + i + "][" + dimIndex + "]");
217 }
218 }
219
220 if (iter.hasNext()) {
221 fail("Too long");
222 }
223 }
224 }