DOMite-Tests.st 5.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212
  1. Smalltalk createPackage: 'DOMite-Tests'!
  2. TestCase subclass: #DOMiteTest
  3. instanceVariableNames: 'fixtureDiv'
  4. package: 'DOMite-Tests'!
  5. !DOMiteTest methodsFor: 'fixture'!
  6. setUp
  7. fixtureDiv := PlatformDom newElement: 'div'.
  8. document body appendChild: fixtureDiv.
  9. fixtureDiv setAttribute: 'id' to: 'fixture'.
  10. fixtureDiv innerHTML: 'sentinel'
  11. !
  12. tearDown
  13. | lastChild |
  14. lastChild := document body lastChild.
  15. self assert: lastChild equals: fixtureDiv.
  16. document body removeChild: lastChild
  17. !
  18. testedClass
  19. ^ Domite
  20. ! !
  21. !DOMiteTest methodsFor: 'testing'!
  22. assertBodyEndsWith: aString
  23. | sanitizedBody sanitizedAssertion |
  24. sanitizedBody := document body innerHTML replace: '\s*' with: ''.
  25. sanitizedAssertion := aString replace: '\s*' with: ''.
  26. self assert: sanitizedBody size >= sanitizedAssertion size.
  27. self
  28. assert: (sanitizedBody last: sanitizedAssertion size)
  29. equals: sanitizedAssertion
  30. !
  31. testDefaultInsertElement
  32. self testedClass new << (self testedClass newElement: 'p').
  33. self assertBodyEndsWith: '<p></p>'.
  34. document body removeChild: document body lastChild
  35. !
  36. testDefaultInsertString
  37. self testedClass new << 'a-foo--in-a-bar'.
  38. self assertBodyEndsWith: 'a-foo--in-a-bar'.
  39. document body removeChild: document body lastChild
  40. !
  41. testDefaultInsertStringInFragment
  42. self testedClass new << (self testedClass newStream << 'a-foo--in-a-bar').
  43. self assertBodyEndsWith: 'a-foo--in-a-bar'.
  44. document body removeChild: document body lastChild
  45. !
  46. testEntityConversion
  47. self assert: '&copy;' htmlTextContent equals: '©'
  48. !
  49. testFromBadSelectorIsInvalid
  50. | d |
  51. d := self testedClass at: '#goo'.
  52. self assert: d isInvalid.
  53. d := self testedClass at: 'body'.
  54. self deny: d isInvalid.
  55. d := self testedClass at: 'html body div#fixture'.
  56. self deny: d isInvalid
  57. !
  58. testInsertDomNode
  59. | d |
  60. d := self testedClass fromElement: fixtureDiv.
  61. d << (PlatformDom newElement: 'pre').
  62. self assertBodyEndsWith: '>sentinel<pre></pre></div>'
  63. !
  64. testInsertDomNodeInFragment
  65. | d |
  66. d := self testedClass at: '#fixture'.
  67. d << (self testedClass newStream << (PlatformDom newElement: 'script')).
  68. self assertBodyEndsWith: '>sentinel<script></script></div>'
  69. !
  70. testInsertDomNodeInRawDomFragment
  71. | d f |
  72. d := self testedClass at: '#fixture'.
  73. f := #() asDomNode.
  74. f appendChild: (PlatformDom newElement: 'script').
  75. d << f.
  76. self assertBodyEndsWith: '>sentinel<script></script></div>'
  77. !
  78. testInsertElement
  79. | d |
  80. d := self testedClass at: 'html body div#fixture'.
  81. d << (self testedClass newElement: 'p').
  82. self assertBodyEndsWith: '>sentinel<p></p></div>'
  83. !
  84. testInsertElementTwoLevel
  85. | d p s |
  86. d := self testedClass fromElement: fixtureDiv.
  87. p := self testedClass newElement: 'p'.
  88. d << p.
  89. s := self testedClass newElement: 'span'.
  90. p << s.
  91. s << 'dom-mite'.
  92. self assertBodyEndsWith: '>sentinel<p><span>dom-mite</span></p></div>'
  93. !
  94. testInsertElementTwoLevelViaFragments
  95. | d p s |
  96. d := self testedClass at: '#fixture'.
  97. p := self testedClass newElement: 'p'.
  98. d << (self testedClass newStream << p).
  99. s := self testedClass newElement: 'span'.
  100. p << (self testedClass newStream << s).
  101. s << (self testedClass newStream << 'dom-mite').
  102. self assertBodyEndsWith: '>sentinel<p><span>dom-mite</span></p></div>'
  103. !
  104. testInsertElementTwoLevelViaTwoLevelFragments
  105. | d p s |
  106. d := self testedClass fromElement: fixtureDiv.
  107. p := self testedClass newElement: 'p'.
  108. d << (self testedClass newStream << (self testedClass newStream << p)).
  109. s := self testedClass newElement: 'span'.
  110. p << (self testedClass newStream << (self testedClass newStream << s)).
  111. s << (self testedClass newStream << (self testedClass newStream << 'dom-mite')).
  112. self assertBodyEndsWith: '>sentinel<p><span>dom-mite</span></p></div>'
  113. !
  114. testInsertString
  115. | d |
  116. d := self testedClass fromElement: fixtureDiv.
  117. d << 'a-foo--in-a-bar'.
  118. self assertBodyEndsWith: '>sentinela-foo--in-a-bar</div>'
  119. !
  120. testInsertStringInFragment
  121. | d |
  122. d := self testedClass at: '#fixture'.
  123. d << (self testedClass newStream << 'a-foo--in-a-bar').
  124. self assertBodyEndsWith: '>sentinela-foo--in-a-bar</div>'
  125. !
  126. testInsertTable
  127. | d tbl tr |
  128. d := self testedClass at: 'html body div#fixture'.
  129. tbl := self testedClass newElement: 'table'.
  130. tr := self testedClass newElement: 'tr'.
  131. tr << ((self testedClass newElement: 'td') << 'A').
  132. tr << ((self testedClass newElement: 'td') << 'B').
  133. tr << ((self testedClass newElement: 'td') << 'C').
  134. tbl << tr.
  135. tr := self testedClass newElement: 'tr'.
  136. tr << ((self testedClass newElement: 'td') << 'D').
  137. tr << ((self testedClass newElement: 'td') << 'E').
  138. tr << ((self testedClass newElement: 'td') << 'F').
  139. tbl << tr.
  140. d << tbl.
  141. self assertBodyEndsWith: '>sentinel<table><tr><td>A</td><td>B</td><td>C</td></tr><tr><td>D</td><td>E</td><td>F</td></tr></table></div>'
  142. !
  143. testMultipleInserts
  144. | d p s |
  145. d := self testedClass fromElement: fixtureDiv.
  146. p := self testedClass newElement: 'p'.
  147. d << p.
  148. s := self testedClass newElement: 'span'.
  149. d << s.
  150. d << 'dom-mite'.
  151. self assertBodyEndsWith: '>sentinel<p></p><span></span>dom-mite</div>'
  152. !
  153. testMultipleInsertsWithClear
  154. | d p s |
  155. d := self testedClass at: '#fixture'.
  156. p := self testedClass newElement: 'p'.
  157. d << p.
  158. s := self testedClass newElement: 'span'.
  159. d << s.
  160. d resetContents.
  161. d << 'dom-mite'.
  162. d resetContents.
  163. d resetContents.
  164. self assertBodyEndsWith: '></div>'
  165. !
  166. testMultipleInsertsWithClearInBetween
  167. | d p s |
  168. d := self testedClass fromElement: fixtureDiv.
  169. p := self testedClass newElement: 'p'.
  170. d << p.
  171. s := self testedClass newElement: 'span'.
  172. d << s.
  173. d resetContents.
  174. d << 'dom-mite'.
  175. self assertBodyEndsWith: '>dom-mite</div>'
  176. !
  177. testTextContentDoesNotRunScript
  178. self shouldnt: [ '<script>throw new Error("Intentional")</script>' htmlTextContent ] raise: Error
  179. ! !