DOMite-Tests.st 5.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203
  1. Smalltalk createPackage: 'DOMite-Tests'!
  2. TestCase subclass: #DOMiteTest
  3. instanceVariableNames: 'fixtureDiv'
  4. package: 'DOMite-Tests'!
  5. !DOMiteTest methodsFor: 'fixture'!
  6. setUp
  7. fixtureDiv := document createElement: '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 << (document createElement: 'pre').
  62. self assertBodyEndsWith: '>sentinel<pre></pre></div>'
  63. !
  64. testInsertDomNodeInFragment
  65. | d |
  66. d := self testedClass at: '#fixture'.
  67. d << (self testedClass newStream << (document createElement: 'script')).
  68. self assertBodyEndsWith: '>sentinel<script></script></div>'
  69. !
  70. testInsertElement
  71. | d |
  72. d := self testedClass at: 'html body div#fixture'.
  73. d << (self testedClass newElement: 'p').
  74. self assertBodyEndsWith: '>sentinel<p></p></div>'
  75. !
  76. testInsertElementTwoLevel
  77. | d p s |
  78. d := self testedClass fromElement: fixtureDiv.
  79. p := self testedClass newElement: 'p'.
  80. d << p.
  81. s := self testedClass newElement: 'span'.
  82. p << s.
  83. s << 'dom-mite'.
  84. self assertBodyEndsWith: '>sentinel<p><span>dom-mite</span></p></div>'
  85. !
  86. testInsertElementTwoLevelViaFragments
  87. | d p s |
  88. d := self testedClass at: '#fixture'.
  89. p := self testedClass newElement: 'p'.
  90. d << (self testedClass newStream << p).
  91. s := self testedClass newElement: 'span'.
  92. p << (self testedClass newStream << s).
  93. s << (self testedClass newStream << 'dom-mite').
  94. self assertBodyEndsWith: '>sentinel<p><span>dom-mite</span></p></div>'
  95. !
  96. testInsertElementTwoLevelViaTwoLevelFragments
  97. | d p s |
  98. d := self testedClass fromElement: fixtureDiv.
  99. p := self testedClass newElement: 'p'.
  100. d << (self testedClass newStream << (self testedClass newStream << p)).
  101. s := self testedClass newElement: 'span'.
  102. p << (self testedClass newStream << (self testedClass newStream << s)).
  103. s << (self testedClass newStream << (self testedClass newStream << 'dom-mite')).
  104. self assertBodyEndsWith: '>sentinel<p><span>dom-mite</span></p></div>'
  105. !
  106. testInsertString
  107. | d |
  108. d := self testedClass fromElement: fixtureDiv.
  109. d << 'a-foo--in-a-bar'.
  110. self assertBodyEndsWith: '>sentinela-foo--in-a-bar</div>'
  111. !
  112. testInsertStringInFragment
  113. | d |
  114. d := self testedClass at: '#fixture'.
  115. d << (self testedClass newStream << 'a-foo--in-a-bar').
  116. self assertBodyEndsWith: '>sentinela-foo--in-a-bar</div>'
  117. !
  118. testInsertTable
  119. | d tbl tr |
  120. d := self testedClass at: 'html body div#fixture'.
  121. tbl := self testedClass newElement: 'table'.
  122. tr := self testedClass newElement: 'tr'.
  123. tr << ((self testedClass newElement: 'td') << 'A').
  124. tr << ((self testedClass newElement: 'td') << 'B').
  125. tr << ((self testedClass newElement: 'td') << 'C').
  126. tbl << tr.
  127. tr := self testedClass newElement: 'tr'.
  128. tr << ((self testedClass newElement: 'td') << 'D').
  129. tr << ((self testedClass newElement: 'td') << 'E').
  130. tr << ((self testedClass newElement: 'td') << 'F').
  131. tbl << tr.
  132. d << tbl.
  133. 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>'
  134. !
  135. testMultipleInserts
  136. | d p s |
  137. d := self testedClass fromElement: fixtureDiv.
  138. p := self testedClass newElement: 'p'.
  139. d << p.
  140. s := self testedClass newElement: 'span'.
  141. d << s.
  142. d << 'dom-mite'.
  143. self assertBodyEndsWith: '>sentinel<p></p><span></span>dom-mite</div>'
  144. !
  145. testMultipleInsertsWithClear
  146. | d p s |
  147. d := self testedClass at: '#fixture'.
  148. p := self testedClass newElement: 'p'.
  149. d << p.
  150. s := self testedClass newElement: 'span'.
  151. d << s.
  152. d resetContents.
  153. d << 'dom-mite'.
  154. d resetContents.
  155. d resetContents.
  156. self assertBodyEndsWith: '></div>'
  157. !
  158. testMultipleInsertsWithClearInBetween
  159. | d p s |
  160. d := self testedClass fromElement: fixtureDiv.
  161. p := self testedClass newElement: 'p'.
  162. d << p.
  163. s := self testedClass newElement: 'span'.
  164. d << s.
  165. d resetContents.
  166. d << 'dom-mite'.
  167. self assertBodyEndsWith: '>dom-mite</div>'
  168. !
  169. testTextContentDoesNotRunScript
  170. self shouldnt: [ '<script>throw new Error("Intentional")</script>' htmlTextContent ] raise: Error
  171. ! !