View Javadoc
1   /*
2    * Copyright 2007, 2008 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  /**
17   * @author Kim Hansen
18   */
19  package eu.simuline.octave;
20  
21  import java.io.File;
22  import java.io.IOException;
23  import java.io.StringReader;
24  import java.io.StringWriter;
25  import java.io.Writer;
26  
27  import static org.junit.Assert.assertEquals;
28  import static org.junit.Assert.assertTrue;
29  import static org.junit.Assert.fail;
30  
31  import org.junit.Ignore;
32  import org.junit.Test;
33  
34  import eu.simuline.octave.exception.OctaveException;
35  import eu.simuline.octave.exception.OctaveIOException;
36  import eu.simuline.octave.type.Octave;
37  import eu.simuline.octave.type.OctaveDouble;
38  import eu.simuline.octave.type.OctaveObject;
39  
40  /**
41   * Tests eu.simuline.octave.Octave.*
42   */
43  public class TestOctave {
44  
45      /**
46       * @param args
47       */
48      public static void main(final String[] args) {
49  	org.junit.runner.JUnitCore.runClasses(TestOctave.class);
50      }
51  
52      // Tests:
53  
54      /*
55       * Octave() and Octave(Writer, Writer) is tested in setUp()
56       */
57  
58      /*
59       * close() is tested in tearDown()
60       */
61  
62      /**
63       * Test method for set(String,double), getScalar(), execute(String)
64       * 
65       * @throws Exception
66       */
67      @Test public void testExecute() throws Exception {
68          final OctaveEngine octave = new OctaveEngineFactory().getScriptEngine();
69  
70          final OctaveObject Y = Octave.scalar(2);
71          octave.put("y", Y);
72          final OctaveObject X = Octave.scalar(42);
73          octave.put("x", X);
74          final OctaveObject Z = Octave.scalar(4);
75          octave.put("z", Z);
76  
77          OctaveDouble x = octave.get(OctaveDouble.class, "x");
78          assertEquals(42.0, x.get(1, 1), 0.0);
79  
80          octave.eval("x = x + 10;");
81          x = octave.get(OctaveDouble.class, "x");
82          assertEquals(52.0, x.get(1, 1), 0.0);
83          octave.close();
84      }
85  
86      /**
87       * Test method for reader=exec(reader)
88       * 
89       * @throws Exception
90       */
91      @Test public void testExec() throws Exception {
92          final OctaveEngine octave = new OctaveEngineFactory().getScriptEngine();
93          octave.put("x", Octave.scalar(42));
94          octave.unsafeEval(new StringReader("x=x+10;"));
95          final OctaveDouble octaveScalar = octave.get(OctaveDouble.class, "x");
96          final double x = octaveScalar.get(1, 1);
97          assertEquals(52.0, x, 0.0);
98          octave.close();
99      }
100 
101     /**
102      * @throws Exception
103      */
104     // does something like 
105     // Running eu.simuline.octave.TestOctave
106     // 2017-11-28 23:52:09,016 [main-javaoctave-ReaderWriterPipeThread] 
107     // ERROR eu.simuline.octave.util.ReaderWriterPipeThread 
108     // (ReaderWriterPipeThread.java:81) - Error when reading from reader
109     // java.io.IOException: Stream closed
110     // at java.io.BufferedInputStream.getBufIfOpen(BufferedInputStream.java:170)
111     // at java.io.BufferedInputStream.read1(BufferedInputStream.java:283)
112     // at java.io.BufferedInputStream.read(BufferedInputStream.java:345)
113     // at sun.nio.cs.StreamDecoder.readBytes(StreamDecoder.java:284)
114     // at sun.nio.cs.StreamDecoder.implRead(StreamDecoder.java:326)
115     // at sun.nio.cs.StreamDecoder.read(StreamDecoder.java:178)
116     // at java.io.InputStreamReader.read(InputStreamReader.java:184)
117     // at java.io.Reader.read(Reader.java:140)
118     // at eu.simuline.octave.util.ReaderWriterPipeThread
119     //                                      .run(ReaderWriterPipeThread.java:79)
120     @Test public void testDestroy() throws Exception {
121 	final OctaveEngine octave = new OctaveEngineFactory().getScriptEngine();
122 	octave.eval("sigterm_dumps_octave_core(0);");
123 	Thread thread = new DestroyThread(octave);
124 
125 	// destroys itself in 1000 ms 
126 	thread.start();
127 	try {
128 	    // octave pauses for 10 sec and so thread is destroyed during pause 
129 	    octave.eval("pause(10);");
130 	    fail("Exception expected. ");
131 	} catch (final OctaveException oe) {
132 	    assertTrue(oe.isDestroyed());
133 	    System.out.println("Stacktrace above is intended: is by logging. ");
134 	    System.out.println("Message 'Uncaught:...' also. ");
135 	} catch (final Throwable th) {
136 	    assertTrue(false);
137 	}
138     }
139 
140     /**
141      * Helper for TestOctave
142      * 
143      * @author Kim Hansen
144      */
145     private static class DestroyThread extends Thread {
146         private final OctaveEngine octave;
147 
148         private DestroyThread(final OctaveEngine octave) {
149             this.octave = octave;
150         }
151 
152         @Override
153         public void run() {
154             try {
155                 sleep(1000);
156                 octave.destroy();
157             } catch (final Throwable e) {
158                 e.printStackTrace();
159             }
160         }
161     }
162 
163     /**
164      * Test advanced Constructor to Octave()
165      * 
166      * @throws Exception
167      */
168     @Test public void testConstructor() throws Exception {
169         final OctaveEngineFactory octaveEngineFactory = 
170 	    new OctaveEngineFactory();
171         octaveEngineFactory.setOctaveProgramFile(new File("octave"));
172         final OctaveEngine octave = octaveEngineFactory.getScriptEngine();
173         octave.setWriter(null);
174         octave.eval("disp('testConstructor');");
175         octave.close();
176     }
177 
178     /**
179      * Test if files are closed by the Octave object
180      * 
181      * @throws Exception
182      */
183     @Test public void testFileClose() throws Exception {
184         final Writer stdin  = new DontCloseWriter("stdin");
185         final Writer stdout = new DontCloseWriter("stdout");
186         final Writer stderr = new DontCloseWriter("stderr");
187         final OctaveEngineFactory octaveEngineFactory = 
188 	    new OctaveEngineFactory();
189         octaveEngineFactory.setErrorWriter(stderr);
190         octaveEngineFactory.setOctaveInputLog(stdin);
191         final OctaveEngine octave = octaveEngineFactory.getScriptEngine();
192         octave.setWriter(stdout);
193         octave.eval("disp('testFileClose');");
194         octave.close();
195 
196         final OctaveEngine octave2 = octaveEngineFactory.getScriptEngine();
197         octave.setWriter(stdout);
198         try {
199             octave2.unsafeEval("error('testFileClose2');");
200             fail();
201         } catch (final OctaveException e) {
202             assertTrue(e instanceof OctaveIOException);
203         }
204     }
205 
206     private static class DontCloseWriter extends Writer {
207         private final String name;
208 
209         private DontCloseWriter(final String name) {
210             this.name = name;
211         }
212 
213         @Override
214         public void write(final char[] cbuf, final int off, final int len) {
215             // Don't do anything
216         }
217 
218         @Override
219         public void flush() {
220             // Don't do anything
221         }
222 
223         @Override
224         public void close() throws IOException {
225             throw new IOException("DontCloseWriter '" + name + "' closed.");
226         }
227     }
228 
229     /**
230      * Test
231      */
232     @Test public void testOutputWithoutNewline() {
233         final OctaveEngine octave = new OctaveEngineFactory().getScriptEngine();
234         final StringWriter result = new StringWriter();
235         octave.setWriter(result);
236         octave.eval("printf('testOutputWithoutNewline1');");
237         assertEquals("testOutputWithoutNewline1", result.toString());
238         result.getBuffer().setLength(0);
239         octave.eval("disp('testOutputWithoutNewline2');");
240         assertEquals("testOutputWithoutNewline2\n", result.toString());
241         result.getBuffer().setLength(0);
242         octave.eval("printf('testOutput\\nWithoutNewline3');");
243         assertEquals("testOutput\nWithoutNewline3", result.toString());
244         result.getBuffer().setLength(0);
245         octave.eval("disp('testOutput\\nWithoutNewline4');");
246         assertEquals("testOutput\\nWithoutNewline4\n", result.toString());
247         result.getBuffer().setLength(0);
248         octave.eval("disp(\"testOutput\\nWithoutNewline5\");");
249         assertEquals("testOutput\nWithoutNewline5\n", result.toString());
250         result.getBuffer().setLength(0);
251         octave.eval("'testOutputWithoutNewline6'");
252         assertEquals("ans = testOutputWithoutNewline6\n", result.toString());
253         octave.close();
254     }
255 
256 }