/tst/org/diffkit/diff/engine/tst/TestTableComparison.groovy

http://diffkit.googlecode.com/ · Groovy · 247 lines · 186 code · 38 blank · 23 comment · 11 complexity · 5f02330a7eef68ced2391ed05919b615 MD5 · raw file

  1. /**
  2. * Copyright 2010-2011 Joseph Panico
  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 org.diffkit.diff.engine.tst
  17. import org.apache.commons.collections.comparators.ComparatorChain
  18. import org.diffkit.diff.diffor.DKEqualsDiffor;
  19. import org.diffkit.diff.engine.DKColumnComparison
  20. import org.diffkit.diff.engine.DKColumnModel
  21. import org.diffkit.diff.engine.DKDiff;
  22. import org.diffkit.diff.engine.DKSide;
  23. import org.diffkit.diff.engine.DKStandardTableComparison
  24. import org.diffkit.diff.engine.DKTableModel
  25. import groovy.util.GroovyTestCase
  26. /**
  27. * @author jpanico
  28. */
  29. public class TestTableComparison extends GroovyTestCase {
  30. public void testRowDisplayValues(){
  31. DKColumnModel column1_1 = [0, 'column1', DKColumnModel.Type.STRING]
  32. DKColumnModel column1_2 = [1, 'column2', DKColumnModel.Type.STRING]
  33. DKColumnModel column1_3 = [2, 'column3', DKColumnModel.Type.INTEGER]
  34. DKColumnModel[] columns = [column1_1, column1_2, column1_3]
  35. int[] key = [0,2]
  36. DKTableModel lhsTable = ["lhs_table",columns, key]
  37. DKColumnModel column2_1 = [0, 'column1', DKColumnModel.Type.STRING]
  38. DKColumnModel column2_2 = [1, 'column2', DKColumnModel.Type.INTEGER]
  39. DKColumnModel column2_3 = [2, 'column3', DKColumnModel.Type.INTEGER]
  40. columns = [column2_1, column2_2, column2_3]
  41. key = [0,2]
  42. DKTableModel rhsTable = ["rhs_table",columns, key]
  43. DKColumnComparison[] map = DKColumnComparison.createColumnPlans(lhsTable, rhsTable, (int[])[1], DKEqualsDiffor.instance)
  44. int[][] displayIndexes = [(int[])[0,2],(int[])[0,2]]
  45. DKStandardTableComparison plan = new DKStandardTableComparison(lhsTable, rhsTable, DKDiff.Kind.BOTH, map, (int[])[1], displayIndexes, 100)
  46. def rowDisplayValues = plan.getRowDisplayValues((Object[])['zzzz', 'zzzz', 1], (Object[])['zzzz', 'zzzz', 1])
  47. // println "rowDisplayValues->$rowDisplayValues"
  48. assert rowDisplayValues == [column1:'zzzz', column3:'1']
  49. rowDisplayValues = plan.getRowDisplayValues((Object[])['zzzz', 'zzzz', 1], (Object[])['aaaa', 'zzzz', 1])
  50. assert rowDisplayValues == [column1:'zzzz:aaaa', column3:'1']
  51. rowDisplayValues = plan.getRowDisplayValues((Object[])[null, 'zzzz', 1], (Object[])['aaaa', 'zzzz', 1])
  52. assert rowDisplayValues == [column1:'<null>:aaaa', column3:'1']
  53. displayIndexes = [(int[])[0,2],(int[])[1]]
  54. plan = new DKStandardTableComparison(lhsTable, rhsTable, DKDiff.Kind.BOTH, map, (int[])[1], displayIndexes, 100)
  55. rowDisplayValues = plan.getRowDisplayValues((Object[])['zzzz', 'zzzz', 1], (Object[])['zzzz', 'cccc', 1])
  56. assert rowDisplayValues == [column1:'zzzz:', column2:':cccc', column3:'1:']
  57. column1_1 = [0, 'column1_1', DKColumnModel.Type.STRING]
  58. column1_2 = [1, 'column1_2', DKColumnModel.Type.STRING]
  59. column1_3 = [2, 'column1_3', DKColumnModel.Type.INTEGER]
  60. columns = [column1_1, column1_2, column1_3]
  61. key = [0,2]
  62. lhsTable = ["lhs_table",columns, key]
  63. column2_1 = [0, 'column2_1', DKColumnModel.Type.STRING]
  64. column2_2 = [1, 'column2_2', DKColumnModel.Type.INTEGER]
  65. column2_3 = [2, 'column2_3', DKColumnModel.Type.INTEGER]
  66. columns = [column2_1, column2_2, column2_3]
  67. key = [0,2]
  68. rhsTable = ["rhs_table",columns, key]
  69. displayIndexes = [(int[])[0,2],(int[])[0,2]]
  70. map =DKColumnComparison.createColumnPlans(lhsTable, rhsTable, (int[])[1], DKEqualsDiffor.instance)
  71. plan = new DKStandardTableComparison(lhsTable, rhsTable, DKDiff.Kind.BOTH, map, (int[])[1], displayIndexes, 100)
  72. rowDisplayValues = plan.getRowDisplayValues((Object[])['zzzz', 'zzzz', 1], (Object[])['zzzz', 'zzzz', 1])
  73. println "rowDisplayValues->$rowDisplayValues"
  74. assert rowDisplayValues == [column1_1:'zzzz:', column2_1:':zzzz', column1_3:'1:', column2_3:':1']
  75. column1_1 = [0, 'column1_1', DKColumnModel.Type.STRING]
  76. column1_2 = [1, 'column1_2', DKColumnModel.Type.STRING]
  77. column1_3 = [2, 'column3', DKColumnModel.Type.INTEGER]
  78. columns = [column1_1, column1_2, column1_3]
  79. key = [0,2]
  80. lhsTable = ["lhs_table",columns, key]
  81. column2_1 = [0, 'column2_1', DKColumnModel.Type.STRING]
  82. column2_2 = [1, 'column2_2', DKColumnModel.Type.INTEGER]
  83. column2_3 = [2, 'column3', DKColumnModel.Type.INTEGER]
  84. columns = [column2_1, column2_2, column2_3]
  85. key = [0,2]
  86. rhsTable = ["rhs_table",columns, key]
  87. displayIndexes = [(int[])[0,2],(int[])[0,2]]
  88. map =DKColumnComparison.createColumnPlans(lhsTable, rhsTable, (int[])[1], DKEqualsDiffor.instance)
  89. plan = new DKStandardTableComparison(lhsTable, rhsTable, DKDiff.Kind.BOTH, map, (int[])[1], displayIndexes, 100)
  90. rowDisplayValues = plan.getRowDisplayValues((Object[])['zzzz', 'zzzz', 1], (Object[])['zzzz', 'zzzz', 1])
  91. assert rowDisplayValues == [column1_1:'zzzz:', column2_1:':zzzz', column3:'1']
  92. }
  93. public void testSimpleRowDisplayValues() {
  94. DKColumnModel column1_1 = [0, 'column1', DKColumnModel.Type.STRING]
  95. DKColumnModel column1_2 = [1, 'column2', DKColumnModel.Type.STRING]
  96. DKColumnModel column1_3 = [2, 'column3', DKColumnModel.Type.INTEGER]
  97. DKColumnModel[] columns = [column1_1, column1_2, column1_3]
  98. int[] key = [0,2]
  99. int[][] displayIndexes = [(int[])[0,2],(int[])[0,2]]
  100. DKTableModel lhsTable = ["lhs_table",columns, key]
  101. DKColumnComparison[] map = DKColumnComparison.createColumnPlans(lhsTable, lhsTable, (int[])[1], DKEqualsDiffor.instance)
  102. DKStandardTableComparison plan = [lhsTable, lhsTable, DKDiff.Kind.BOTH, map, (int[])[1], displayIndexes, 100]
  103. def rowDisplayValues = plan.getRowDisplayValues((Object[])['zzzz', 'aaaa', 1], DKSide.LEFT_INDEX)
  104. // println "rowDisplayValues->$rowDisplayValues"
  105. assert rowDisplayValues == [column1:'zzzz', column3:'1']
  106. rowDisplayValues = plan.getRowDisplayValues((Object[])['zzzz', 'aaaa', null], DKSide.LEFT_INDEX)
  107. // println "rowDisplayValues->$rowDisplayValues"
  108. assert rowDisplayValues == [column1:'zzzz', column3:'<null>']
  109. }
  110. public void testComparatorSort(){
  111. DKColumnModel column1_1 = [0, 'column1_1', DKColumnModel.Type.STRING]
  112. DKColumnModel column1_2 = [1, 'column1_2', DKColumnModel.Type.STRING]
  113. DKColumnModel column1_3 = [2, 'column1_3', DKColumnModel.Type.INTEGER]
  114. DKColumnModel[] columns = [column1_1, column1_2, column1_3]
  115. int[] key = [0,2]
  116. DKTableModel lhsTable = ["lhs_table",columns, key]
  117. DKColumnModel column2_1 = [0, 'column2_1', DKColumnModel.Type.STRING]
  118. DKColumnModel column2_2 = [1, 'column2_2', DKColumnModel.Type.INTEGER]
  119. DKColumnModel column2_3 = [2, 'column2_3', DKColumnModel.Type.INTEGER]
  120. columns = [column2_1, column2_2, column2_3]
  121. key = [0,2]
  122. DKTableModel rhsTable = ["rhs_table",columns, key]
  123. DKColumnComparison[] map = DKColumnComparison.createColumnPlans(lhsTable, rhsTable, (int[])[1], DKEqualsDiffor.instance)
  124. DKStandardTableComparison plan = new DKStandardTableComparison(lhsTable, rhsTable, DKDiff.Kind.BOTH, map, (int[])[1], (int[][])null, 100)
  125. def comparator = plan.rowComparator
  126. Object[] l1 = ['zzzz', 'aaaa', 1]
  127. Object[] l2 = ['zzzz', 'zzzz', 2]
  128. Object[] l3 = ['bbbb', 'zzzz', 1]
  129. Object[] l4 = ['aaaa', 'bbbb', 2]
  130. def rows = [l1, l2, l3, l4]
  131. Collections.sort( rows, comparator)
  132. assert rows == [l4,l3,l1,l2]
  133. }
  134. public void testIdenticalTablesSimpleKeyComparator(){
  135. DKColumnModel column1 = [0, 'column1', DKColumnModel.Type.STRING]
  136. DKColumnModel column2 = [1, 'column2', DKColumnModel.Type.STRING]
  137. DKColumnModel column3 = [2, 'column3', DKColumnModel.Type.INTEGER]
  138. DKColumnModel column4 = [3, 'column4', DKColumnModel.Type.STRING]
  139. DKColumnModel[] columns = [column1, column2, column3, column4]
  140. int[] key = [1]
  141. DKTableModel tableModel = ["table_model",columns, key]
  142. DKColumnComparison[] map = DKColumnComparison.createColumnPlans(tableModel,tableModel, (int[])[1], DKEqualsDiffor.instance)
  143. DKStandardTableComparison plan = [tableModel, tableModel, DKDiff.Kind.BOTH, map, (int[])[1], null, 100]
  144. def comparator = plan.rowComparator
  145. assert comparator
  146. assert comparator instanceof ComparatorChain
  147. assert comparator.size() == 1
  148. Object[] lhs = ['1111', 'aaaa', 3, 'value4']
  149. Object[] rhs = ['2222', 'bbbb', 3, 'value4']
  150. assert comparator.compare(lhs, rhs) <0
  151. key = [2]
  152. tableModel = ["table_model",columns, key]
  153. plan = [tableModel, tableModel, DKDiff.Kind.BOTH, map, (int[])[1], null, 100]
  154. comparator = plan.rowComparator
  155. assert comparator.compare(lhs, rhs) ==0
  156. key = [3]
  157. tableModel = ["table_model",columns, key]
  158. plan = [tableModel, tableModel, DKDiff.Kind.BOTH, map, (int[])[1], null, 100]
  159. comparator = plan.rowComparator
  160. assert comparator.compare(lhs, rhs) ==0
  161. }
  162. public void testFailures(){
  163. DKColumnModel column1_1 = [0, 'column1_1', DKColumnModel.Type.STRING]
  164. DKColumnModel[] columns = [column1_1]
  165. int[] key = [0]
  166. DKTableModel lhsTable = ["lhs_table",columns, key]
  167. DKColumnModel column2_1 = [0, 'column2_1', DKColumnModel.Type.STRING]
  168. DKColumnModel column2_2 = [1, 'column2_2', DKColumnModel.Type.INTEGER]
  169. DKColumnModel column2_3 = [2, 'column2_3', DKColumnModel.Type.STRING]
  170. columns = [column2_1, column2_2, column2_3]
  171. key = [0,2]
  172. DKTableModel rhsTable = ["rhs_table",columns, key]
  173. DKColumnComparison[] map = DKColumnComparison.createColumnPlans(lhsTable, rhsTable, (int[])[0], DKEqualsDiffor.instance)
  174. // key sizes don't match
  175. shouldFail(RuntimeException) {
  176. def DKStandardTableComparison plan = new DKStandardTableComparison(lhsTable, rhsTable, DKDiff.Kind.BOTH, map, (int[])[1], null, 100)
  177. }
  178. DKColumnModel column1_2 = [1, 'column1_2', DKColumnModel.Type.INTEGER]
  179. DKColumnModel column1_3 = [2, 'column1_3', DKColumnModel.Type.STRING]
  180. columns = [column1_1, column1_2, column1_3]
  181. key = [0,1]
  182. lhsTable = ["lhs_table",columns, key]
  183. // key type don't match
  184. shouldFail(RuntimeException) {
  185. def DKStandardTableComparison plan = new DKStandardTableComparison(lhsTable, rhsTable, DKDiff.Kind.BOTH, map, (int[])[1], null, 100)
  186. }
  187. }
  188. public void testDifferentTablesCompoundKeyComparator(){
  189. DKColumnModel column1_1 = [0, 'column1_1', DKColumnModel.Type.STRING]
  190. DKColumnModel column1_2 = [1, 'column1_2', DKColumnModel.Type.STRING]
  191. DKColumnModel column1_3 = [2, 'column1_3', DKColumnModel.Type.INTEGER]
  192. DKColumnModel[] columns = [column1_1, column1_2, column1_3]
  193. int[] key = [0,2]
  194. DKTableModel lhsTable = ["lhs_table",columns, key]
  195. DKColumnModel column2_1 = [0, 'column2_1', DKColumnModel.Type.STRING]
  196. DKColumnModel column2_2 = [1, 'column2_2', DKColumnModel.Type.STRING]
  197. DKColumnModel column2_3 = [2, 'column2_3', DKColumnModel.Type.INTEGER]
  198. DKColumnModel column2_4 = [3, 'column2_4', DKColumnModel.Type.INTEGER]
  199. columns = [column2_1, column2_2, column2_3, column2_4]
  200. key = [1,3]
  201. DKTableModel rhsTable = ["rhs_table",columns, key]
  202. DKColumnComparison[] map = DKColumnComparison.createColumnPlans(lhsTable, rhsTable, (int[])[1], DKEqualsDiffor.instance)
  203. DKStandardTableComparison plan = new DKStandardTableComparison(lhsTable, rhsTable, DKDiff.Kind.BOTH, map, (int[])[1], null, 100)
  204. def comparator = plan.rowComparator
  205. assert comparator
  206. assert comparator instanceof ComparatorChain
  207. assert comparator.size() == 2
  208. }
  209. }