1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16 package eu.simuline.octave.io.impl;
17
18 import java.io.BufferedReader;
19 import java.io.StringReader;
20
21 import eu.simuline.octave.OctaveEngine;
22 import eu.simuline.octave.OctaveEngineFactory;
23 import eu.simuline.octave.exception.OctaveParseException;
24 import eu.simuline.octave.io.OctaveIO;
25 import eu.simuline.octave.type.Octave;
26 import eu.simuline.octave.type.OctaveCell;
27 import eu.simuline.octave.type.OctaveDouble;
28 import eu.simuline.octave.type.OctaveObject;
29 import eu.simuline.octave.type.OctaveString;
30 import eu.simuline.octave.type.OctaveStruct;
31
32 import static org.junit.Assert.assertEquals;
33 import static org.junit.Assert.fail;
34
35 import org.junit.Ignore;
36 import org.junit.Test;
37
38
39
40
41 public class TestIoOctaveStruct {
42
43
44
45 @Test public void testConstructor() {
46 final OctaveObject struct = new OctaveStruct();
47 assertEquals("# name: mystruct\n" +
48 "# type: struct\n" +
49 "# length: 0\n",
50 OctaveIO.toText("mystruct", struct));
51 }
52
53
54
55 @Test public void testSet() {
56 final OctaveStruct struct1 = new OctaveStruct();
57 struct1.set("a", Octave.scalar(42));
58 assertEquals("# name: mystruct\n" +
59 "# type: struct\n" +
60 "# length: 1\n" +
61 "# name: a\n" +
62 "# type: cell\n" +
63 "# rows: 1\n" +
64 "# columns: 1\n" +
65 "# name: <cell-element>\n" +
66 "# type: scalar\n" +
67 "42.0\n" +
68 "\n",
69 OctaveIO.toText("mystruct", struct1));
70 final OctaveStruct struct2 = new OctaveStruct();
71 final OctaveCell octaveCell = new OctaveCell(0, 0);
72 octaveCell.set(Octave.scalar(42), 1, 1);
73 struct2.set("mycell", octaveCell);
74 assertEquals("# name: mystruct\n" +
75 "# type: struct\n" +
76 "# length: 1\n" +
77 "# name: mycell\n" +
78 "# type: cell\n" +
79 "# rows: 1\n" +
80 "# columns: 1\n" +
81 "# name: <cell-element>\n" +
82 "# type: cell\n" +
83 "# rows: 1\n" +
84 "# columns: 1\n" +
85 "# name: <cell-element>\n" +
86 "# type: scalar\n" +
87 "42.0\n" +
88 "\n" +
89 "\n",
90 OctaveIO.toText("mystruct", struct2));
91 }
92
93
94
95 @Test public void testOctaveConnection() {
96 OctaveStruct struct = new OctaveStruct();
97 struct.set("scalar", Octave.scalar(42));
98 OctaveStruct nested_struct = new OctaveStruct();
99 nested_struct.set("string", new OctaveString("a cheese called Horace"));
100 struct.set("mynestedstruct", nested_struct);
101
102 OctaveEngine octave = new OctaveEngineFactory().getScriptEngine();
103 octave.put("mystruct", struct);
104 OctaveStruct mystruct_copy = octave.get(OctaveStruct.class, "mystruct");
105 assertEquals(struct, mystruct_copy);
106 octave.close();
107 }
108
109
110
111
112 @Test public void testMatices() {
113 final OctaveEngine octave = new OctaveEngineFactory().getScriptEngine();
114 octave.eval("s = struct();");
115 final int[] i123 = { 1, 2, 3 };
116 for (final int i : i123) {
117 octave.eval(setMatrix(i));
118 for (final int j : i123) {
119 octave.eval(setMatrix(i, j));
120 for (final int k : i123) {
121 octave.eval(setMatrix(i, j, k));
122 for (final int l : i123) {
123 octave.eval(setMatrix(i, j, k, l));
124 }
125 }
126 }
127 }
128 final OctaveStruct s1 = octave.get(OctaveStruct.class, "s");
129 octave.put("s1", s1);
130
131 octave.eval("t = 1.0*isequal(s, s1);");
132 final OctaveDouble t = octave.get(OctaveDouble.class, "t");
133 assertEquals(1.0, t.get(1, 1), 0.0);
134 final OctaveStruct s2 = octave.get(OctaveStruct.class, "s1");
135 assertEquals(s1, s2);
136 octave.close();
137 }
138
139 private String setMatrix(final int... sizes) {
140 final StringBuilder b = new StringBuilder();
141 b.append("s.x");
142 for (final int s : sizes) {
143 b.append(Integer.toString(s));
144 }
145 b.append(" = round(1000*rand(");
146 boolean first = true;
147 for (final int s : sizes) {
148 if (first) {
149 first = false;
150 } else {
151 b.append(", ");
152 }
153 b.append(Integer.toString(s));
154 }
155 b.append("))/1000;");
156 return b.toString();
157 }
158
159
160
161
162 @Test public void testMatrixStruct() {
163 final String input =
164 "# type: struct\n" +
165 "# length: 1\n" +
166 "# name: y\n" +
167 "# type: cell\n" +
168 "# rows: 1\n" +
169 "# columns: 2\n" +
170 "# name: <cell-element>\n" +
171 "# type: scalar\n" +
172 "1\n" +
173 "\n" +
174 "# name: <cell-element>\n" +
175 "# type: scalar\n" +
176 "2\n" +
177 "\n" +
178 "\n";
179 try {
180 OctaveIO.read(new BufferedReader(new StringReader(input)));
181 fail();
182 } catch (final RuntimeException e) {
183 assertEquals(OctaveParseException.class, e.getClass());
184 }
185 }
186
187
188
189
190 @Test public void testWrite() throws Exception {
191 final OctaveStruct struct = new OctaveStruct();
192 struct.set("x", Octave.scalar(42));
193
194 assertEquals("# name: ans\n" +
195 "# type: struct\n" +
196 "# length: 1\n" +
197
198 "# name: x\n" +
199 "# type: cell\n" +
200 "# rows: 1\n" +
201 "# columns: 1\n" +
202 "# name: <cell-element>\n" +
203 "# type: scalar\n" +
204 "42.0\n" +
205 "\n",
206 OctaveIO.toText(struct));
207
208 struct.set("y", Octave.scalar(43));
209
210 assertEquals("# name: ans\n" +
211 "# type: struct\n" +
212 "# length: 2\n" +
213
214 "# name: x\n" +
215 "# type: cell\n" +
216 "# rows: 1\n" +
217 "# columns: 1\n" +
218 "# name: <cell-element>\n" +
219 "# type: scalar\n" +
220 "42.0\n" +
221 "\n" +
222
223 "# name: y\n" +
224 "# type: cell\n" +
225 "# rows: 1\n" +
226 "# columns: 1\n" +
227 "# name: <cell-element>\n" +
228 "# type: scalar\n" +
229 "43.0\n" +
230 "\n",
231 OctaveIO.toText(struct));
232 }
233
234
235
236
237 @Test public void testWriteRead() throws Exception {
238 final OctaveStruct struct = new OctaveStruct();
239 struct.set("x", Octave.scalar(42));
240 struct.set("y", new OctaveString("y"));
241 struct.set("z", new OctaveString("z"));
242
243 final String text = OctaveIO.toText(struct);
244 final BufferedReader bufferedReader =
245 new BufferedReader(new StringReader(text));
246
247 assertEquals("# name: ans", bufferedReader.readLine());
248 assertEquals(struct, OctaveIO.read(bufferedReader));
249 assertEquals(-1, bufferedReader.read());
250 }
251
252
253
254
255
256 @Test public void testScalarStruct() {
257 final OctaveEngine octave = new OctaveEngineFactory().getScriptEngine();
258 octave.eval("mystruct = struct();");
259 octave.eval("mystruct.x = 42;");
260 OctaveStruct mystruct = octave.get(OctaveStruct.class, "mystruct");
261 octave.close();
262 assertEquals(42.0, mystruct.get(OctaveDouble.class, "x").get(1), 0.0);
263 }
264
265 }