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