]> git.wincent.com - wikitext.git/blob - spec/integration_spec.rb
fcb96af1ebf3faa62463a082c3fa38663aeefe25
[wikitext.git] / spec / integration_spec.rb
1 # encoding: utf-8
2 # Copyright 2007-2010 Wincent Colaiuta. All rights reserved.
3 #
4 # Redistribution and use in source and binary forms, with or without
5 # modification, are permitted provided that the following conditions are met:
6 #
7 # 1. Redistributions of source code must retain the above copyright notice,
8 #    this list of conditions and the following disclaimer.
9 # 2. Redistributions in binary form must reproduce the above copyright notice,
10 #    this list of conditions and the following disclaimer in the documentation
11 #    and/or other materials provided with the distribution.
12
13 # THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
14 # AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
15 # IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
16 # ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS OR CONTRIBUTORS BE
17 # LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
18 # CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
19 # SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
20 # INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
21 # CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
22 # ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
23 # POSSIBILITY OF SUCH DAMAGE.
24
25 require File.join(File.dirname(__FILE__), 'spec_helper.rb')
26
27 describe Wikitext::Parser, 'with large slab of input text' do
28   before do
29     @parser = Wikitext::Parser.new
30   end
31
32   # the integration spec is designed to test all aspects of the parser at once
33   it 'should handle complex input containing nested structures, syntax errors, and exercising a wide variety features' do
34     input = dedent <<-END
35       paragraph
36       second line
37       
38       new paragraph
39       
40       literal &quot; HTML &copy; entities
41       
42       UTF-8 characters: € etc
43       
44       characters which have <special> meaning in "HTML" & all that
45       
46       = a heading =
47       
48       > a blockquote
49       > second line of blockquote
50       >
51       > new paragraph within blockquote. this one features ''an
52       > unclosed em span (should be automatically closed).
53       > 
54       > Note how the optional space following the blockquote marker
55       >has no effect.
56       
57       Now check out the alternative blockquote syntax:
58       
59       <blockquote>
60       This type of syntax is useful for
61       when you have a large number of lines
62       in the blockquote and it would be tedious
63       to prefix every line with a ">".
64       
65       Note that I can divide things up into
66       paragraphs.
67       
68       <blockquote>And I can nest other
69       blockquotes</blockquote>
70       * and
71       *# nest
72       *# lists
73       * too
74       
75       <pre>and include pre blocks as well.
76       This uses the alternative pre block
77       syntax as you can see.</pre>
78       </blockquote>
79       
80       == another heading ==
81       
82       paragraph within ''multiple '''styles''''' and <tt>tt span</tt>
83       
84       similar, but with '''styles in ''different'' order'''
85       
86       again, a '''different ''order'''''
87       
88       * list item 1 [http://google.com/ unterminated
89       ** nested list item 1 with [[bad link
90       ** nested list item 2 with unclosed <tt>span
91       ** nested list item 3
92       * list item 2
93       
94        // this is a code block
95        notice how it can contain ''markup''
96        which would '''otherwise''' have <tt>special</tt> meaning
97        although explicit entities &copy; are passed through unchanged
98       
99       a normal paragraph again
100       
101       {{an_image.png}}
102       
103       > This is another blockquote which demonstrates that we
104       > can nest other structures inside of it. For example, here
105       > we have a code sample:
106       >
107       >  line 1
108       >  line 2
109       >
110       > And now back to the normal blockquote again.
111       >
112       > * here
113       > * is
114       > * a
115       > * list
116       >
117       > And here is a link to [[something]], and some ''other''
118       > `styled` '''spans'''.
119       >
120       > > Finally we have
121       > > a nested blockquote.
122       > > # Which itself contains
123       > > ## a nested list
124       
125       This is where we show a link to an article on [[GCC]].
126       Related to that, [[GCC|a link]] to the same
127       article but with custom link text.
128       
129       External links [http://example.com work too].
130       As well as autolinks as seen http://example.com/
131       here.
132       
133       Look at how we handle bad syntax. [[This is an unterminated
134       link. And [http://example.com/ is another.
135       
136       # this is an ordered list
137       # which continues
138       ## and has another ordered list
139       ## nested inside it
140       # and then falls back
141       #* and then nests another list
142       #* this time an unordered one
143       #** itself containing a nested list
144       #** which continues
145       #**# and finally nests yet another ordered list
146       #**# which continues
147       #* drops back quite a way
148       # and finally all the way
149       #****** and finishes with an invalid item
150       
151       === heading with missing closing tag
152       * list
153       # new list
154     END
155
156     expected = dedent <<-END
157       <p>paragraph second line</p>
158       <p>new paragraph</p>
159       <p>literal &quot; HTML &copy; entities</p>
160       <p>UTF-8 characters: &#x20ac; etc</p>
161       <p>characters which have &lt;special&gt; meaning in &quot;HTML&quot; &amp; all that</p>
162       <h1>a heading</h1>
163       <blockquote>
164         <p>a blockquote second line of blockquote</p>
165         <p>new paragraph within blockquote. this one features <em>an</em> unclosed em span (should be automatically closed).</p>
166         <p>Note how the optional space following the blockquote marker has no effect.</p>
167       </blockquote>
168       <p>Now check out the alternative blockquote syntax:</p>
169       <blockquote>
170         <p>This type of syntax is useful for when you have a large number of lines in the blockquote and it would be tedious to prefix every line with a &quot;&gt;&quot;.</p>
171         <p>Note that I can divide things up into paragraphs.</p>
172         <blockquote>
173           <p>And I can nest other blockquotes</p>
174         </blockquote>
175         <ul>
176           <li>and
177             <ol>
178               <li>nest</li>
179               <li>lists</li>
180             </ol>
181           </li>
182           <li>too</li>
183         </ul>
184         <pre>and include pre blocks as well.
185       This uses the alternative pre block
186       syntax as you can see.</pre>
187       </blockquote>
188       <h2>another heading</h2>
189       <p>paragraph within <em>multiple <strong>styles</strong></em> and <tt>tt span</tt></p>
190       <p>similar, but with <strong>styles in <em>different</em> order</strong></p>
191       <p>again, a <strong>different <em>order</em></strong></p>
192       <ul>
193         <li>list item 1 [<a href="http://google.com/" class="external">http://google.com/</a> unterminated
194           <ul>
195             <li>nested list item 1 with [[bad link</li>
196             <li>nested list item 2 with unclosed <tt>span</tt></li>
197             <li>nested list item 3</li>
198           </ul>
199         </li>
200         <li>list item 2</li>
201       </ul>
202       <pre>// this is a code block
203       notice how it can contain ''markup''
204       which would '''otherwise''' have &lt;tt&gt;special&lt;/tt&gt; meaning
205       although explicit entities &copy; are passed through unchanged</pre>
206       <p>a normal paragraph again</p>
207       <p><img src="/images/an_image.png" alt="an_image.png" /></p>
208       <blockquote>
209         <p>This is another blockquote which demonstrates that we can nest other structures inside of it. For example, here we have a code sample:</p>
210         <pre>line 1
211       line 2</pre>
212         <p>And now back to the normal blockquote again.</p>
213         <ul>
214           <li>here</li>
215           <li>is</li>
216           <li>a</li>
217           <li>list</li>
218         </ul>
219         <p>And here is a link to <a href="/wiki/something">something</a>, and some <em>other</em> <tt>styled</tt> <strong>spans</strong>.</p>
220         <blockquote>
221           <p>Finally we have a nested blockquote.</p>
222           <ol>
223             <li>Which itself contains
224               <ol>
225                 <li>a nested list</li>
226               </ol>
227             </li>
228           </ol>
229         </blockquote>
230       </blockquote>
231       <p>This is where we show a link to an article on <a href="/wiki/GCC">GCC</a>. Related to that, <a href="/wiki/GCC">a link</a> to the same article but with custom link text.</p>
232       <p>External links <a href="http://example.com" class="external">work too</a>. As well as autolinks as seen <a href="http://example.com/" class="external">http://example.com/</a> here.</p>
233       <p>Look at how we handle bad syntax. [[This is an unterminated link. And [<a href="http://example.com/" class="external">http://example.com/</a> is another.</p>
234       <ol>
235         <li>this is an ordered list</li>
236         <li>which continues
237           <ol>
238             <li>and has another ordered list</li>
239             <li>nested inside it</li>
240           </ol>
241         </li>
242         <li>and then falls back
243           <ul>
244             <li>and then nests another list</li>
245             <li>this time an unordered one
246               <ul>
247                 <li>itself containing a nested list</li>
248                 <li>which continues
249                   <ol>
250                     <li>and finally nests yet another ordered list</li>
251                     <li>which continues</li>
252                   </ol>
253                 </li>
254               </ul>
255             </li>
256             <li>drops back quite a way</li>
257           </ul>
258         </li>
259         <li>and finally all the way
260           <ul>
261             <li>***** and finishes with an invalid item</li>
262           </ul>
263         </li>
264       </ol>
265       <h3>heading with missing closing tag</h3>
266       <ul>
267         <li>list</li>
268       </ul>
269       <ol>
270         <li>new list</li>
271       </ol>
272     END
273
274     @parser.parse(input).should == expected
275   end
276
277   # Without something like this it is possible to complete the entire spec suite without
278   # triggering garbage collection at all, or at least enough to expose memory-related bugs.
279   # So add one long-running spec to hopefully catch any GC and memory-related bugs.
280   it 'should work correctly during long runs (when Garbage Collection runs)' do
281     input     = "a <strong>simple</strong> ''test'' of the [[wikitext parser]]"
282     expected  = %Q{<p>a <strong>simple</strong> <em>test</em> of the <a href="/wiki/wikitext_parser">wikitext parser</a></p>\n}
283     100_000.times { @parser.parse(input).should == expected }
284   end
285 end