Axxord-Tests.st 6.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248
  1. Smalltalk createPackage: 'Axxord-Tests'!
  2. TestCase subclass: #AxolatorTest
  3. instanceVariableNames: 'rootModel'
  4. package: 'Axxord-Tests'!
  5. !AxolatorTest methodsFor: 'running'!
  6. setUp
  7. rootModel := EavModel new
  8. getBlock: [:x | x root];
  9. putBlock: [:x :y | x root: y].
  10. ! !
  11. !AxolatorTest methodsFor: 'tests'!
  12. testNontrivialModelGetsAppropriateValueForModification
  13. | isolator model result |
  14. result := nil.
  15. isolator := Axolator on: #{ 'foo' -> #('bar' #(1 #(2 5)) 'baz'). 'moo' -> 'zoo' }.
  16. model := EavModel new
  17. getBlock: [ :x | (x root at: 'foo') at: 2 ];
  18. putBlock: [ :x :y | (x root at: 'foo') at: 2 put: y].
  19. isolator model: model modify: [:r|result := r].
  20. self assert: #(1 #(2 5)) equals: result
  21. !
  22. testNontrivialModelModifiesAppropriateValue
  23. | isolator model result |
  24. result := nil.
  25. isolator := Axolator on: #{ 'foo' -> #('bar' #(1 #(2 3)) 'baz'). 'moo' -> 'zoo' }.
  26. model := EavModel new
  27. getBlock: [ :x | (x root at: 'foo') at: 2 ];
  28. putBlock: [ :x :y | (x root at: 'foo') at: 2 put: y].
  29. isolator model: model modify: [:r|#new].
  30. isolator model: model read: [:r|result := r].
  31. self assert: #new equals: result.
  32. isolator model: rootModel read: [:r|result := r].
  33. self assert: #{ 'foo' -> #('bar' #new 'baz'). 'moo' -> 'zoo' } equals: result
  34. !
  35. testNontrivialModelReturnsAppropriateValue
  36. | isolator model result |
  37. result := nil.
  38. isolator := Axolator on: #{ 'foo' -> #('bar' #(1 #(2 3)) 'baz'). 'moo' -> 'zoo' }.
  39. model := EavModel new getBlock: [ :x | (x root at: 'foo') at: 2 ].
  40. isolator model: model read: [:r|result := r].
  41. self assert: #(1 #(2 3)) equals: result
  42. !
  43. testRootModelExaminesThenModifiesRoot
  44. | isolator result |
  45. result := nil.
  46. isolator := Axolator on: #(1 #(2 3)).
  47. isolator model: rootModel modify: [:r|r second].
  48. isolator model: rootModel read: [:r|result := r].
  49. self assert: #(2 3) equals: result
  50. !
  51. testRootModelGetsRootForModification
  52. | isolator result |
  53. result := nil.
  54. isolator := Axolator on: #(2 #(1 0)).
  55. isolator model: rootModel modify: [:r|result := r].
  56. self assert: #(2 #(1 0)) equals: result
  57. !
  58. testRootModelModifiesAndDeeplyIsolatesInPlaceModifiedRoot
  59. | isolator result newValue |
  60. result := nil. newValue := nil.
  61. isolator := Axolator on: #(1 #(2 3)).
  62. isolator model: rootModel modify: [:r|newValue := r. r at: 1 put: 4. r].
  63. newValue at: 2 put: 'bar'.
  64. isolator model: rootModel read: [:r|result := r].
  65. newValue at: 2 put: 'baz'.
  66. self assert: #(4 #(2 3)) equals: result
  67. !
  68. testRootModelModifiesAndDeeplyIsolatesRoot
  69. | isolator result newValue |
  70. result := nil.
  71. isolator := Axolator on: #(1 #(2 3)).
  72. newValue := #{'foo'->#(4 5 6)}.
  73. isolator model: rootModel modify: [:r|newValue].
  74. (newValue at: 'foo') at: 1 put: 'bar'.
  75. isolator model: rootModel read: [:r|result := r].
  76. (newValue at: 'foo') at: 3 put: 'baz'.
  77. self assert: #{'foo'->#(4 5 6)} equals: result
  78. !
  79. testRootModelModifiesAndIsolatesRoot
  80. | isolator result newValue |
  81. result := nil.
  82. isolator := Axolator on: #(1 #(2 3)).
  83. newValue := #{'foo'->#(4 5 6)}.
  84. isolator model: rootModel modify: [:r|newValue].
  85. newValue at: 'foo' put: 'bar'.
  86. isolator model: rootModel read: [:r|result := r].
  87. newValue at: 'foo' put: 'baz'.
  88. self assert: #{'foo'->#(4 5 6)} equals: result
  89. !
  90. testRootModelModifiesRoot
  91. | isolator result |
  92. result := nil.
  93. isolator := Axolator on: #(1 #(2 3)).
  94. isolator model: rootModel modify: [:r|#{'foo'->#(4 5 6)}].
  95. isolator model: rootModel read: [:r|result := r].
  96. self assert: #{'foo'->#(4 5 6)} equals: result
  97. !
  98. testRootModelReturnsDeeplyIsolatedRoot
  99. | isolator result |
  100. result := nil.
  101. isolator := Axolator on: #(1 #(2 3)).
  102. isolator model: rootModel read: [:r|(r at: 2) at: 1 put: 0].
  103. isolator model: rootModel read: [:r|result := r].
  104. self assert: #(1 #(2 3)) equals: result
  105. !
  106. testRootModelReturnsIsolatedRoot
  107. | isolator result |
  108. result := nil.
  109. isolator := Axolator on: #(1 #(2 4)).
  110. isolator model: rootModel read: [:r|r at: 2 put: nil].
  111. isolator model: rootModel read: [:r|result := r].
  112. self assert: #(1 #(2 4)) equals: result
  113. !
  114. testRootModelReturnsRoot
  115. | isolator result |
  116. result := nil.
  117. isolator := Axolator on: #(1 #(2 3)).
  118. isolator model: rootModel read: [:r|result := r].
  119. self assert: #(1 #(2 3)) equals: result
  120. ! !
  121. TestCase subclass: #PlainConsumeTransformTest
  122. instanceVariableNames: ''
  123. package: 'Axxord-Tests'!
  124. !PlainConsumeTransformTest methodsFor: 'tests'!
  125. testModelTransformSentToAxon
  126. | model result axon |
  127. result := nil.
  128. model := #{ 'foo' -> #('bar' #(1 #(2 3)) 'baz'). 'moo' -> 'zoo' }.
  129. axon := TestSpyAxon new.
  130. axon registerIn: model.
  131. model axes: #(foo 2) transform: [:r | #new].
  132. self assert: axon changedAspectLog equals: #((foo 2))
  133. !
  134. testNontrivialModelGetsAppropriateValueForTransform
  135. | model result |
  136. result := nil.
  137. model := #{ 'foo' -> #('bar' #(1 #(2 5)) 'baz'). 'moo' -> 'zoo' }.
  138. model axes: #(foo 2) transform: [:r | result := r].
  139. self assert: #(1 #(2 5)) equals: result
  140. !
  141. testNontrivialModelReturnsAppropriateValue
  142. | model result |
  143. result := nil.
  144. model := #{ 'foo' -> #('bar' #(1 #(2 3)) 'baz'). 'moo' -> 'zoo' }.
  145. model axes: #(foo 2) consume: [:r | result := r].
  146. self assert: #(1 #(2 3)) equals: result
  147. !
  148. testNontrivialModelTransformsAppropriateValue
  149. | model result |
  150. result := nil.
  151. model := #{ 'foo' -> #('bar' #(1 #(2 3)) 'baz'). 'moo' -> 'zoo' }.
  152. model axes: #(foo 2) transform: [:r | #new].
  153. model axes: #(foo 2) consume: [:r | result := r].
  154. self assert: #new equals: result.
  155. model axes: #() consume: [:r | result := r].
  156. self assert: #{ 'foo' -> #('bar' #new 'baz'). 'moo' -> 'zoo' } equals: result
  157. !
  158. testRootModelCannotTransform
  159. | model result |
  160. result := nil.
  161. model := #(1 #(2 3)).
  162. self should: [ model axes: #() transform: [:r | #{'foo'->#(4 5 6)}] ] raise: Error
  163. !
  164. testRootModelReturnsDirectRoot
  165. | model result |
  166. result := nil.
  167. model := #(1 #(2 4)).
  168. model axes: #() consume: [:r | r at: 2 put: nil].
  169. model axes: #() consume: [:r | result := r].
  170. self assert: #(1 nil) equals: result
  171. !
  172. testRootModelReturnsRoot
  173. | model result |
  174. result := nil.
  175. model := #(1 #(2 3)).
  176. model axes: #() consume: [:r | result := r].
  177. self assert: #(1 #(2 3)) equals: result
  178. !
  179. testRootTransformBlockIsRun
  180. | model result |
  181. result := nil.
  182. model := #(2 #(1 0)).
  183. [model axes: #() transform: [:r | result := r. model]] on: Error do: [].
  184. self assert: result equals: model
  185. !
  186. testRootTransformFailsOnActualChange
  187. | model |
  188. model := #(2 #(1 0)).
  189. self should: [model axes: #() transform: [:r | #new]] raise: Error
  190. ! !
  191. DumbAxon subclass: #TestSpyAxon
  192. instanceVariableNames: 'changedAspectLog'
  193. package: 'Axxord-Tests'!
  194. !TestSpyAxon commentStamp!
  195. I am an axon that logs changed aspects. I am useful in tests.!
  196. !TestSpyAxon methodsFor: 'accessing'!
  197. changedAspectLog
  198. ^ changedAspectLog
  199. !
  200. changedAspectLog: anObject
  201. changedAspectLog := anObject
  202. ! !
  203. !TestSpyAxon methodsFor: 'action'!
  204. changed: anAspect
  205. changedAspectLog add: anAspect
  206. ! !
  207. !TestSpyAxon methodsFor: 'initialization'!
  208. initialize
  209. super initialize.
  210. changedAspectLog := #()
  211. ! !