View Javadoc
1   /*
2    * Copyright 2007, 2008, 2009, 2012 Ange Optimization ApS
3    *
4    * Licensed under the Apache License, Version 2.0 (the "License");
5    * you may not use this file except in compliance with the License.
6    * You may obtain a copy of the License at
7    *
8    *     http://www.apache.org/licenses/LICENSE-2.0
9    *
10   * Unless required by applicable law or agreed to in writing, software
11   * distributed under the License is distributed on an "AS IS" BASIS,
12   * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13   * See the License for the specific language governing permissions and
14   * limitations under the License.
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   * Test I/O on OctaveStruct
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      * Test
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 	// "1.0*" is a typecast from bool to scalar
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      * Test that the reader does not understand 1x2 cells
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      * @throws Exception
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      * @throws Exception
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()); // Check end of file
250     }
251 
252     /**
253      * Test format of struct save. 
254      * Exposed a format change between octave 3.4 and 3.6.
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 }