1 /**************************************************************
2  *
3  * Licensed to the Apache Software Foundation (ASF) under one
4  * or more contributor license agreements.  See the NOTICE file
5  * distributed with this work for additional information
6  * regarding copyright ownership.  The ASF licenses this file
7  * to you under the Apache License, Version 2.0 (the
8  * "License"); you may not use this file except in compliance
9  * with the License.  You may obtain a copy of the License at
10  *
11  *   http://www.apache.org/licenses/LICENSE-2.0
12  *
13  * Unless required by applicable law or agreed to in writing,
14  * software distributed under the License is distributed on an
15  * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16  * KIND, either express or implied.  See the License for the
17  * specific language governing permissions and limitations
18  * under the License.
19  *
20  *************************************************************/
21 
22 
23 
24 package ifc.sdbc;
25 
26 import lib.MultiMethodTest;
27 import lib.StatusException;
28 
29 import com.sun.star.sdbc.SQLException;
30 import com.sun.star.sdbc.XResultSetUpdate;
31 import com.sun.star.sdbc.XRowUpdate;
32 import com.sun.star.uno.UnoRuntime;
33 
34 /**
35 /**
36 * Testing <code>com.sun.star.sdbc.XResultSetUpdate</code>
37 * interface methods :
38 * <ul>
39 *  <li><code> insertRow()</code></li>
40 *  <li><code> updateRow()</code></li>
41 *  <li><code> deleteRow()</code></li>
42 *  <li><code> cancelRowUpdates()</code></li>
43 *  <li><code> moveToInsertRow()</code></li>
44 *  <li><code> moveToCurrentRow()</code></li>
45 * </ul> <p>
46 * The test requires the following object relations :
47 * <ul>
48 *  <li><code>'XResultSetUpdate.UpdateTester'</code>
49 *   inner <code>UpdateTester</code> interface implementation :
50 *   is used for checking test results. See interface
51 *   documentation for more information.</li>
52 * </ul>
53 * The test is <b>not designed</b> for multithreaded testing. <p>
54 * After it's execution environment must be recreated.
55 * @see com.sun.star.sdbc.XResultSetUpdate
56 */
57 public class _XResultSetUpdate extends MultiMethodTest {
58 
59     // oObj filled by MultiMethodTest
60     public XResultSetUpdate oObj = null ;
61 
62     private UpdateTester tester = null ;
63 
64     /**
65     * Interface contains some methods for checking
66     * test results. It's implementation must be passed
67     * to this test.
68     */
69     public static interface UpdateTester {
70         /**
71         * @return Current number of rows.
72         */
rowCount()73         public int rowCount() throws SQLException ;
74         /**
75         * Updates some data in the current row but doesn't commit
76         * changes to the source.
77         */
update()78         public void update() throws SQLException ;
79         /**
80         * Checks if updates made by method <code>update</code> was
81         * committed to the data source.
82         */
wasUpdated()83         public boolean wasUpdated() throws SQLException ;
84         /**
85         * Returns current row number. Really it must returns value
86         * < 1 if the current position is on insert row.
87         */
currentRow()88         public int currentRow() throws SQLException ;
89     }
90 
91     /**
92     * Retrieves relation.
93     * @throw StatusException If relation not found.
94     */
before()95     public void before() throws StatusException {
96         tester = (UpdateTester)tEnv.getObjRelation
97             ("XResultSetUpdate.UpdateTester") ;
98 
99         if (tester == null) {
100             log.println("Required relation not found !!!") ;
101             throw new StatusException("Required relation not found !!!",
102                 new NullPointerException()) ;
103         }
104     }
105 
106     /**
107     * Calls method when the cursor position is on existing row.
108     * Checks total number of rows before and after method call. <p>
109     * Executes <code>moveToCurrentRow</code> method test before to
110     * be sure that cursor is not on the insert row. <p>
111     * Has OK status if after method execution number of rows decreased
112     * by one.
113     */
_deleteRow()114     public void _deleteRow() {
115         executeMethod("moveToCurrentRow()") ;
116 
117         //temporary to avoid SOffice hanging
118         executeMethod("updateRow()") ;
119         executeMethod("cancelRowUpdates()") ;
120 
121         boolean result = true ;
122         try {
123             int rowsBefore = tester.rowCount() ;
124             oObj.deleteRow() ;
125             int rowsAfter = tester.rowCount() ;
126 
127             result = rowsBefore == rowsAfter + 1 ;
128         } catch (SQLException e) {
129             e.printStackTrace(log) ;
130             result = false ;
131         }
132 
133         tRes.tested("deleteRow()", result) ;
134     }
135 
136     /**
137     * Using relation methods first updates some data in the current
138     * row, then calls <code>updateRow</code> method to commit data.
139     * Then checks if the data changed was committed. <p>
140     * Executes <code>moveToCurrentRow</code> method test before to
141     * be sure that cursor is not on the insert row. <p>
142     * Has OK status if data in the source was changed.
143     */
_updateRow()144     public void _updateRow() {
145         executeMethod("moveToCurrentRow()") ;
146         boolean result = true ;
147         try {
148             tester.update() ;
149             oObj.updateRow() ;
150 
151             result = tester.wasUpdated() ;
152         } catch (SQLException e) {
153             e.printStackTrace(log) ;
154             result = false ;
155         }
156         tRes.tested("updateRow()", result) ;
157     }
158 
159     /**
160     * Using relation methods first updates some data in the current
161     * row, then calls <code>cancelRowUpdates</code> method.
162     * Then checks if the data changed was not committed. <p>
163     * Executes <code>moveToCurrentRow</code> method test before to
164     * be sure that cursor is not on the insert row. <p>
165     * Has OK status if data in the source was not changed.
166     */
_cancelRowUpdates()167     public void _cancelRowUpdates() {
168         executeMethod("moveToCurrentRow()") ;
169         boolean result = true ;
170         try {
171             tester.update() ;
172             oObj.cancelRowUpdates() ;
173 
174             result = !tester.wasUpdated() ;
175         } catch (SQLException e) {
176             e.printStackTrace(log) ;
177             result = false ;
178         }
179         tRes.tested("cancelRowUpdates()", result) ;
180     }
181 
182     /**
183     * Tries to move cursor to insert row. Then checks current row
184     * number. It must be less than 1. (0 as I know) <p>
185     */
_moveToInsertRow()186     public void _moveToInsertRow() {
187         boolean result = true ;
188         try {
189             oObj.moveToInsertRow() ;
190 
191             result = tester.currentRow() < 1 ;
192         } catch (SQLException e) {
193             e.printStackTrace(log) ;
194             result = false ;
195         }
196         tRes.tested("moveToInsertRow()", result) ;
197     }
198 
199     /**
200     * Returns cursor from insert row back to previous row. <p>
201     * <code>moveToInsertRow</code> method test must be executed
202     * first for positioning curosr to insert row. <p>
203     * Has OK status if after method call current row number is
204     * above 0.
205     */
206     public void _moveToCurrentRow() {
207         boolean result = true ;
208         try {
209             oObj.moveToCurrentRow() ;
210 
211             result = tester.currentRow() >= 1 ;
212         } catch (SQLException e) {
213             e.printStackTrace(log) ;
214             result = false ;
215         }
216         tRes.tested("moveToCurrentRow()", result) ;
217     }
218 
219     /**
220     * Moves cursor to the insert row, then calls the method
221     * <code>insertRow</code>. Before and after call stores
222     * total number of rows. <p>
223     * Has OK status if after method call rows number increases
224     * by one.
225     */
_insertRow()226     public void _insertRow() {
227         executeMethod("moveToInsertRow()") ;
228         boolean result = true ;
229         try {
230             oObj.moveToCurrentRow();
231             int rowsBefore = tester.rowCount() ;
232             oObj.moveToInsertRow() ;
233             XRowUpdate rowU = (XRowUpdate)
234                             UnoRuntime.queryInterface(XRowUpdate.class, oObj);
235             rowU.updateString(1,"open");
236             rowU.updateInt(2,5);
237             rowU.updateDouble(5,3.4);
238             rowU.updateBoolean(10,true);
239             oObj.insertRow() ;
240             oObj.moveToCurrentRow();
241             int rowsAfter = tester.rowCount() ;
242             result = rowsBefore + 1 == rowsAfter ;
243         } catch (SQLException e) {
244             e.printStackTrace(log) ;
245             log.println("******"+e.getMessage());
246             result = false ;
247         }
248         tRes.tested("insertRow()", result) ;
249     }
250 
251     /**
252     * Forces environment to be recreated.
253     */
after()254     public void after() {
255         //disposeEnvironment() ;
256     }
257 }  // finish class _XResultSetUpdate
258 
259 
260