koara 0.9.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +7 -0
- data/.gitignore +3 -0
- data/.gitmodules +3 -0
- data/.travis.yml +1 -0
- data/Gemfile +3 -0
- data/Rakefile +11 -0
- data/koara.gemspec +18 -0
- data/lib/koara.rb +7 -0
- data/lib/koara/ast/blockelement.rb +40 -0
- data/lib/koara/ast/blockquote.rb +7 -0
- data/lib/koara/ast/code.rb +7 -0
- data/lib/koara/ast/codeblock.rb +9 -0
- data/lib/koara/ast/document.rb +8 -0
- data/lib/koara/ast/em.rb +7 -0
- data/lib/koara/ast/heading.rb +8 -0
- data/lib/koara/ast/image.rb +7 -0
- data/lib/koara/ast/linebreak.rb +7 -0
- data/lib/koara/ast/link.rb +7 -0
- data/lib/koara/ast/listblock.rb +13 -0
- data/lib/koara/ast/listitem.rb +9 -0
- data/lib/koara/ast/node.rb +25 -0
- data/lib/koara/ast/paragraph.rb +7 -0
- data/lib/koara/ast/strong.rb +7 -0
- data/lib/koara/ast/text.rb +7 -0
- data/lib/koara/charstream.rb +123 -0
- data/lib/koara/io/filereader.rb +25 -0
- data/lib/koara/io/stringreader.rb +26 -0
- data/lib/koara/koararenderer.rb +203 -0
- data/lib/koara/lookahead_success.rb +4 -0
- data/lib/koara/parser.rb +2475 -0
- data/lib/koara/token.rb +19 -0
- data/lib/koara/token_manager.rb +349 -0
- data/lib/koara/tree_state.rb +46 -0
- data/test/charstream_test.rb +76 -0
- data/test/compliance_test.rb +43 -0
- data/test/end_to_end_test.rb +1049 -0
- data/test/filereader-unicode.kd +1 -0
- data/test/filereader.kd +1 -0
- data/test/filereader_test.rb +103 -0
- data/test/html5renderer.rb +179 -0
- data/test/stringreader_test.rb +103 -0
- data/test/token_manager_test.rb +157 -0
- metadata +94 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
ðinæ
|
data/test/filereader.kd
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
abcd
|
|
@@ -0,0 +1,103 @@
|
|
|
1
|
+
require 'koara'
|
|
2
|
+
require 'minitest/autorun'
|
|
3
|
+
|
|
4
|
+
class FileReaderTest < MiniTest::Unit::TestCase
|
|
5
|
+
def setup
|
|
6
|
+
@buffer = Array.new
|
|
7
|
+
end
|
|
8
|
+
|
|
9
|
+
def test_read
|
|
10
|
+
@reader = FileReader.new('test/filereader.kd')
|
|
11
|
+
assert_equal(4, @reader.read(@buffer, 0, 4))
|
|
12
|
+
assert_equal('a', @buffer[0])
|
|
13
|
+
assert_equal('b', @buffer[1])
|
|
14
|
+
assert_equal('c', @buffer[2])
|
|
15
|
+
assert_equal('d', @buffer[3])
|
|
16
|
+
assert_equal(4, @buffer.length)
|
|
17
|
+
assert_equal(-1, @reader.read(@buffer, 0, 4))
|
|
18
|
+
end
|
|
19
|
+
|
|
20
|
+
def test_read_part_of_string
|
|
21
|
+
@reader = FileReader.new('test/filereader.kd')
|
|
22
|
+
assert_equal(2, @reader.read(@buffer, 0, 2))
|
|
23
|
+
assert_equal('a', @buffer[0])
|
|
24
|
+
assert_equal('b', @buffer[1])
|
|
25
|
+
assert_equal(2, @buffer.length)
|
|
26
|
+
end
|
|
27
|
+
|
|
28
|
+
def test_read_with_offset_part_of_string
|
|
29
|
+
@reader = FileReader.new('test/filereader.kd')
|
|
30
|
+
assert_equal(4, @reader.read(@buffer, 2, 4))
|
|
31
|
+
assert_equal(nil, @buffer[0])
|
|
32
|
+
assert_equal(nil, @buffer[1])
|
|
33
|
+
assert_equal('a', @buffer[2])
|
|
34
|
+
assert_equal('b', @buffer[3])
|
|
35
|
+
end
|
|
36
|
+
|
|
37
|
+
def test_read_with_offset_too_large_part_of_string
|
|
38
|
+
@reader = FileReader.new('test/filereader.kd')
|
|
39
|
+
assert_equal(4, @reader.read(@buffer, 6, 4))
|
|
40
|
+
assert_equal(nil, @buffer[0])
|
|
41
|
+
assert_equal(nil, @buffer[1])
|
|
42
|
+
assert_equal(nil, @buffer[2])
|
|
43
|
+
assert_equal(nil, @buffer[3])
|
|
44
|
+
end
|
|
45
|
+
|
|
46
|
+
def test_read_until_eof
|
|
47
|
+
@reader = FileReader.new('test/filereader.kd')
|
|
48
|
+
assert_equal(2, @reader.read(@buffer, 0, 2))
|
|
49
|
+
assert_equal('a', @buffer[0])
|
|
50
|
+
assert_equal('b', @buffer[1])
|
|
51
|
+
assert_equal(2, @reader.read(@buffer, 0, 3))
|
|
52
|
+
assert_equal('c', @buffer[0])
|
|
53
|
+
assert_equal('d', @buffer[1])
|
|
54
|
+
assert_equal(-1, @reader.read(@buffer, 0, 2))
|
|
55
|
+
end
|
|
56
|
+
|
|
57
|
+
def test_read_with_unicode
|
|
58
|
+
@reader = FileReader.new('test/filereader-unicode.kd')
|
|
59
|
+
assert_equal(4, @reader.read(@buffer, 0, 4))
|
|
60
|
+
assert_equal('ð', @buffer[0])
|
|
61
|
+
assert_equal('i', @buffer[1])
|
|
62
|
+
assert_equal('n', @buffer[2])
|
|
63
|
+
assert_equal('æ', @buffer[3])
|
|
64
|
+
assert_equal(4, @buffer.length)
|
|
65
|
+
end
|
|
66
|
+
|
|
67
|
+
def test_read_with_unicode_part_of_string
|
|
68
|
+
@reader = FileReader.new('test/filereader-unicode.kd')
|
|
69
|
+
assert_equal(2, @reader.read(@buffer, 0, 2))
|
|
70
|
+
assert_equal('ð', @buffer[0])
|
|
71
|
+
assert_equal('i', @buffer[1])
|
|
72
|
+
assert_equal(2, @buffer.length)
|
|
73
|
+
end
|
|
74
|
+
|
|
75
|
+
def test_read_with_unicode_and_offset_part_of_string
|
|
76
|
+
@reader = FileReader.new('test/filereader-unicode.kd')
|
|
77
|
+
assert_equal(4, @reader.read(@buffer, 2, 4))
|
|
78
|
+
assert_equal(nil, @buffer[0])
|
|
79
|
+
assert_equal(nil, @buffer[1])
|
|
80
|
+
assert_equal('ð', @buffer[2])
|
|
81
|
+
assert_equal('i', @buffer[3])
|
|
82
|
+
end
|
|
83
|
+
|
|
84
|
+
def test_read_with_unicode_and_offset_too_large_part_of_string
|
|
85
|
+
@reader = FileReader.new('test/filereader-unicode.kd')
|
|
86
|
+
assert_equal(4, @reader.read(@buffer, 6, 4))
|
|
87
|
+
assert_equal(nil, @buffer[0])
|
|
88
|
+
assert_equal(nil, @buffer[1])
|
|
89
|
+
assert_equal(nil, @buffer[2])
|
|
90
|
+
assert_equal(nil, @buffer[3])
|
|
91
|
+
end
|
|
92
|
+
|
|
93
|
+
def test_read_with_unicode_until_eof
|
|
94
|
+
@reader = FileReader.new('test/filereader-unicode.kd')
|
|
95
|
+
assert_equal(3, @reader.read(@buffer, 0, 3))
|
|
96
|
+
assert_equal('ð', @buffer[0])
|
|
97
|
+
assert_equal('i', @buffer[1])
|
|
98
|
+
assert_equal(1, @reader.read(@buffer, 0, 3))
|
|
99
|
+
assert_equal('æ', @buffer[0])
|
|
100
|
+
assert_equal(-1, @reader.read(@buffer, 0, 2))
|
|
101
|
+
end
|
|
102
|
+
|
|
103
|
+
end
|
|
@@ -0,0 +1,179 @@
|
|
|
1
|
+
class Html5Renderer
|
|
2
|
+
|
|
3
|
+
def visit_document(node)
|
|
4
|
+
@level = 0
|
|
5
|
+
@list_sequence = Array.new
|
|
6
|
+
@out = StringIO.new
|
|
7
|
+
node.children_accept(self)
|
|
8
|
+
end
|
|
9
|
+
|
|
10
|
+
def visit_heading(node)
|
|
11
|
+
@out << indent + '<h' + node.value.to_s + '>'
|
|
12
|
+
node.children_accept(self)
|
|
13
|
+
@out << '</h' + node.value.to_s + ">\n"
|
|
14
|
+
unless node.nested
|
|
15
|
+
@out << "\n"
|
|
16
|
+
end
|
|
17
|
+
end
|
|
18
|
+
|
|
19
|
+
def visit_blockquote(node)
|
|
20
|
+
@out << indent + '<blockquote>'
|
|
21
|
+
if !node.children.nil? && node.children.any?
|
|
22
|
+
@out << "\n"
|
|
23
|
+
end
|
|
24
|
+
@level += 1
|
|
25
|
+
node.children_accept(self)
|
|
26
|
+
@level-=1
|
|
27
|
+
@out << indent + "</blockquote>\n"
|
|
28
|
+
if !node.nested
|
|
29
|
+
@out << "\n"
|
|
30
|
+
end
|
|
31
|
+
end
|
|
32
|
+
|
|
33
|
+
def visit_list_block(node)
|
|
34
|
+
@list_sequence.push(0)
|
|
35
|
+
tag = node.ordered ? 'ol' : 'ul'
|
|
36
|
+
@out << "#{indent}<#{tag}>\n"
|
|
37
|
+
@level += 1
|
|
38
|
+
node.children_accept(self)
|
|
39
|
+
@level -= 1
|
|
40
|
+
@out << "#{indent}</#{tag}>\n"
|
|
41
|
+
if !node.nested
|
|
42
|
+
@out << "\n"
|
|
43
|
+
end
|
|
44
|
+
@list_sequence.pop
|
|
45
|
+
end
|
|
46
|
+
|
|
47
|
+
def visit_list_item(node)
|
|
48
|
+
seq = @list_sequence.last.to_i + 1
|
|
49
|
+
@list_sequence[-1] = seq
|
|
50
|
+
@out << "#{indent}<li"
|
|
51
|
+
|
|
52
|
+
if node.number && seq != node.number.to_i
|
|
53
|
+
@out << " value=\"#{node.number}\""
|
|
54
|
+
@list_sequence.push(node.number)
|
|
55
|
+
end
|
|
56
|
+
@out << '>'
|
|
57
|
+
if !node.children.nil?
|
|
58
|
+
block = node.children[0].instance_of?(Paragraph) || node.children[0].instance_of?(BlockElement)
|
|
59
|
+
if (node.children.length > 1 || !block)
|
|
60
|
+
@out << "\n"
|
|
61
|
+
end
|
|
62
|
+
@level += 1
|
|
63
|
+
node.children_accept(self)
|
|
64
|
+
@level -= 1
|
|
65
|
+
if (node.children.length > 1 || !block)
|
|
66
|
+
@out << indent
|
|
67
|
+
end
|
|
68
|
+
end
|
|
69
|
+
@out << "</li>\n"
|
|
70
|
+
end
|
|
71
|
+
|
|
72
|
+
def visit_codeblock(node)
|
|
73
|
+
@out << indent + '<pre><code'
|
|
74
|
+
if node.language
|
|
75
|
+
@out << " class=\"language-" + escape(node.language) + "\""
|
|
76
|
+
end
|
|
77
|
+
@out << '>'
|
|
78
|
+
@out << escape(node.value) + "</code></pre>\n"
|
|
79
|
+
@out << ("\n") if !node.nested
|
|
80
|
+
end
|
|
81
|
+
|
|
82
|
+
def visit_paragraph(node)
|
|
83
|
+
if node.nested && node.parent.instance_of?(ListItem) && node.is_single_child
|
|
84
|
+
node.children_accept(self)
|
|
85
|
+
else
|
|
86
|
+
@out << indent + '<p>'
|
|
87
|
+
node.children_accept(self)
|
|
88
|
+
@out << "</p>\n"
|
|
89
|
+
unless node.nested
|
|
90
|
+
@out << "\n"
|
|
91
|
+
end
|
|
92
|
+
end
|
|
93
|
+
end
|
|
94
|
+
|
|
95
|
+
def visit_block_element(node)
|
|
96
|
+
if node.nested && node.parent.instance_of?(ListItem) && node.is_single_child
|
|
97
|
+
node.children_accept(self)
|
|
98
|
+
else
|
|
99
|
+
@out << indent
|
|
100
|
+
node.children_accept(self)
|
|
101
|
+
if !node.nested
|
|
102
|
+
@out << "\n"
|
|
103
|
+
end
|
|
104
|
+
end
|
|
105
|
+
end
|
|
106
|
+
|
|
107
|
+
def visit_image(node)
|
|
108
|
+
@out << "<img src=\"" + escape_url(node.value) + "\" alt=\""
|
|
109
|
+
node.children_accept(self)
|
|
110
|
+
@out << "\" />"
|
|
111
|
+
end
|
|
112
|
+
|
|
113
|
+
def visit_link(node)
|
|
114
|
+
@out << "<a href=\"" + escape_url(node.value) + "\">"
|
|
115
|
+
node.children_accept(self)
|
|
116
|
+
@out << '</a>'
|
|
117
|
+
end
|
|
118
|
+
|
|
119
|
+
def visit_strong(node)
|
|
120
|
+
@out << '<strong>'
|
|
121
|
+
node.children_accept(self)
|
|
122
|
+
@out << '</strong>'
|
|
123
|
+
end
|
|
124
|
+
|
|
125
|
+
def visit_em(node)
|
|
126
|
+
@out << '<em>'
|
|
127
|
+
node.children_accept(self)
|
|
128
|
+
@out << '</em>'
|
|
129
|
+
end
|
|
130
|
+
|
|
131
|
+
def visit_code(node)
|
|
132
|
+
@out << '<code>'
|
|
133
|
+
node.children_accept(self)
|
|
134
|
+
@out << '</code>'
|
|
135
|
+
end
|
|
136
|
+
|
|
137
|
+
def visit_text(node)
|
|
138
|
+
@out << escape(node.value.to_s)
|
|
139
|
+
end
|
|
140
|
+
|
|
141
|
+
#
|
|
142
|
+
def escape(text)
|
|
143
|
+
return text.gsub(/&/, '&')
|
|
144
|
+
.gsub(/</, '<')
|
|
145
|
+
.gsub(/>/, '>')
|
|
146
|
+
.gsub(/"/, '"')
|
|
147
|
+
end
|
|
148
|
+
|
|
149
|
+
def visit_linebreak(node)
|
|
150
|
+
@out << "<br>\n" + indent
|
|
151
|
+
node.children_accept(self)
|
|
152
|
+
end
|
|
153
|
+
|
|
154
|
+
def escape_url(text)
|
|
155
|
+
text.gsub(/ /, '%20')
|
|
156
|
+
.gsub(/"/, '%22')
|
|
157
|
+
.gsub(/`/, '%60')
|
|
158
|
+
.gsub(/</, '%3C')
|
|
159
|
+
.gsub(/>/, '%3E')
|
|
160
|
+
.gsub(/\[/, '%5B')
|
|
161
|
+
.gsub(/\]/, '%5D')
|
|
162
|
+
.gsub(/\\/, '%5C')
|
|
163
|
+
end
|
|
164
|
+
|
|
165
|
+
def indent
|
|
166
|
+
repeat = @level * 2
|
|
167
|
+
str = StringIO.new
|
|
168
|
+
repeat.times {
|
|
169
|
+
str << ' '
|
|
170
|
+
}
|
|
171
|
+
str.string
|
|
172
|
+
end
|
|
173
|
+
|
|
174
|
+
def output
|
|
175
|
+
@out.string.strip
|
|
176
|
+
end
|
|
177
|
+
|
|
178
|
+
|
|
179
|
+
end
|
|
@@ -0,0 +1,103 @@
|
|
|
1
|
+
require 'koara'
|
|
2
|
+
require 'minitest/autorun'
|
|
3
|
+
|
|
4
|
+
class StringReaderTest < MiniTest::Unit::TestCase
|
|
5
|
+
def setup
|
|
6
|
+
@buffer = Array.new
|
|
7
|
+
end
|
|
8
|
+
|
|
9
|
+
def test_read
|
|
10
|
+
@reader = StringReader.new('abcd')
|
|
11
|
+
assert_equal(4, @reader.read(@buffer, 0, 4))
|
|
12
|
+
assert_equal('a', @buffer[0])
|
|
13
|
+
assert_equal('b', @buffer[1])
|
|
14
|
+
assert_equal('c', @buffer[2])
|
|
15
|
+
assert_equal('d', @buffer[3])
|
|
16
|
+
assert_equal(4, @buffer.length)
|
|
17
|
+
assert_equal(-1, @reader.read(@buffer, 0, 4))
|
|
18
|
+
end
|
|
19
|
+
|
|
20
|
+
def test_read_part_of_string
|
|
21
|
+
@reader = StringReader.new('abcd')
|
|
22
|
+
assert_equal(2, @reader.read(@buffer, 0, 2))
|
|
23
|
+
assert_equal('a', @buffer[0])
|
|
24
|
+
assert_equal('b', @buffer[1])
|
|
25
|
+
assert_equal(2, @buffer.length)
|
|
26
|
+
end
|
|
27
|
+
|
|
28
|
+
def test_read_with_offset_part_of_string
|
|
29
|
+
@reader = StringReader.new('abcd')
|
|
30
|
+
assert_equal(4, @reader.read(@buffer, 2, 4))
|
|
31
|
+
assert_equal(nil, @buffer[0])
|
|
32
|
+
assert_equal(nil, @buffer[1])
|
|
33
|
+
assert_equal('a', @buffer[2])
|
|
34
|
+
assert_equal('b', @buffer[3])
|
|
35
|
+
end
|
|
36
|
+
|
|
37
|
+
def test_read_with_offset_too_large_part_of_string
|
|
38
|
+
@reader = StringReader.new('abcd')
|
|
39
|
+
assert_equal(4, @reader.read(@buffer, 6, 4))
|
|
40
|
+
assert_equal(nil, @buffer[0])
|
|
41
|
+
assert_equal(nil, @buffer[1])
|
|
42
|
+
assert_equal(nil, @buffer[2])
|
|
43
|
+
assert_equal(nil, @buffer[3])
|
|
44
|
+
end
|
|
45
|
+
|
|
46
|
+
def test_read_until_eof
|
|
47
|
+
@reader = StringReader.new('abcd')
|
|
48
|
+
assert_equal(2, @reader.read(@buffer, 0, 2))
|
|
49
|
+
assert_equal('a', @buffer[0])
|
|
50
|
+
assert_equal('b', @buffer[1])
|
|
51
|
+
assert_equal(2, @reader.read(@buffer, 0, 3))
|
|
52
|
+
assert_equal('c', @buffer[0])
|
|
53
|
+
assert_equal('d', @buffer[1])
|
|
54
|
+
assert_equal(-1, @reader.read(@buffer, 0, 2))
|
|
55
|
+
end
|
|
56
|
+
|
|
57
|
+
def test_read_with_unicode
|
|
58
|
+
@reader = StringReader.new('ðinæ')
|
|
59
|
+
assert_equal(4, @reader.read(@buffer, 0, 4))
|
|
60
|
+
assert_equal('ð', @buffer[0])
|
|
61
|
+
assert_equal('i', @buffer[1])
|
|
62
|
+
assert_equal('n', @buffer[2])
|
|
63
|
+
assert_equal('æ', @buffer[3])
|
|
64
|
+
assert_equal(4, @buffer.length)
|
|
65
|
+
end
|
|
66
|
+
|
|
67
|
+
def test_read_with_unicode_part_of_string
|
|
68
|
+
@reader = StringReader.new('ðinæ')
|
|
69
|
+
assert_equal(2, @reader.read(@buffer, 0, 2))
|
|
70
|
+
assert_equal('ð', @buffer[0])
|
|
71
|
+
assert_equal('i', @buffer[1])
|
|
72
|
+
assert_equal(2, @buffer.length)
|
|
73
|
+
end
|
|
74
|
+
|
|
75
|
+
def test_Read_with_unicode_and_offset_part_of_string
|
|
76
|
+
@reader = StringReader.new('ðinæ')
|
|
77
|
+
assert_equal(4, @reader.read(@buffer, 2, 4))
|
|
78
|
+
assert_equal(nil, @buffer[0])
|
|
79
|
+
assert_equal(nil, @buffer[1])
|
|
80
|
+
assert_equal('ð', @buffer[2])
|
|
81
|
+
assert_equal('i', @buffer[3])
|
|
82
|
+
end
|
|
83
|
+
|
|
84
|
+
def test_read_with_unicode_and_offset_too_large_part_of_string
|
|
85
|
+
@reader = StringReader.new('ðinæ')
|
|
86
|
+
assert_equal(4, @reader.read(@buffer, 6, 4))
|
|
87
|
+
assert_equal(nil, @buffer[0])
|
|
88
|
+
assert_equal(nil, @buffer[1])
|
|
89
|
+
assert_equal(nil, @buffer[2])
|
|
90
|
+
assert_equal(nil, @buffer[3])
|
|
91
|
+
end
|
|
92
|
+
|
|
93
|
+
def test_read_with_unicode_until_eof
|
|
94
|
+
@reader = StringReader.new('ðinæ')
|
|
95
|
+
assert_equal(3, @reader.read(@buffer, 0, 3))
|
|
96
|
+
assert_equal('ð', @buffer[0])
|
|
97
|
+
assert_equal('i', @buffer[1])
|
|
98
|
+
assert_equal(1, @reader.read(@buffer, 0, 3))
|
|
99
|
+
assert_equal('æ', @buffer[0])
|
|
100
|
+
assert_equal(-1, @reader.read(@buffer, 0, 2))
|
|
101
|
+
end
|
|
102
|
+
|
|
103
|
+
end
|
|
@@ -0,0 +1,157 @@
|
|
|
1
|
+
require 'koara'
|
|
2
|
+
require 'minitest/autorun'
|
|
3
|
+
|
|
4
|
+
class TokenManagerTest < MiniTest::Unit::TestCase
|
|
5
|
+
|
|
6
|
+
|
|
7
|
+
def test_eof
|
|
8
|
+
token = TokenManager.new(CharStream.new(StringReader.new('')))::get_next_token
|
|
9
|
+
assert_equal(TokenManager::EOF, token.kind)
|
|
10
|
+
end
|
|
11
|
+
|
|
12
|
+
def test_asterisk
|
|
13
|
+
token = TokenManager.new(CharStream.new(StringReader.new('*'))).get_next_token
|
|
14
|
+
assert_equal(TokenManager::ASTERISK, token.kind)
|
|
15
|
+
assert_equal('*', token.image)
|
|
16
|
+
end
|
|
17
|
+
|
|
18
|
+
def test_backslash
|
|
19
|
+
token = TokenManager.new(CharStream.new(StringReader.new('\\'))).get_next_token
|
|
20
|
+
assert_equal(TokenManager::BACKSLASH, token.kind)
|
|
21
|
+
assert_equal('\\', token.image)
|
|
22
|
+
end
|
|
23
|
+
|
|
24
|
+
def test_backtick
|
|
25
|
+
token = TokenManager.new(CharStream.new(StringReader.new('`'))).get_next_token
|
|
26
|
+
assert_equal(TokenManager::BACKTICK, token.kind)
|
|
27
|
+
assert_equal('`', token.image)
|
|
28
|
+
end
|
|
29
|
+
|
|
30
|
+
def test_char_sequence_lowercase
|
|
31
|
+
token = TokenManager.new(CharStream.new(StringReader.new('m'))).get_next_token
|
|
32
|
+
assert_equal(TokenManager::CHAR_SEQUENCE, token.kind)
|
|
33
|
+
assert_equal('m', token.image)
|
|
34
|
+
end
|
|
35
|
+
|
|
36
|
+
def test_char_sequence_uppercase
|
|
37
|
+
token = TokenManager.new(CharStream.new(StringReader.new('C'))).get_next_token
|
|
38
|
+
assert_equal(TokenManager::CHAR_SEQUENCE, token.kind)
|
|
39
|
+
assert_equal('C', token.image)
|
|
40
|
+
end
|
|
41
|
+
|
|
42
|
+
def test_colon
|
|
43
|
+
token = TokenManager.new(CharStream.new(StringReader.new(':'))).get_next_token
|
|
44
|
+
assert_equal(TokenManager::COLON, token.kind)
|
|
45
|
+
assert_equal(':', token.image)
|
|
46
|
+
end
|
|
47
|
+
|
|
48
|
+
def test_dash
|
|
49
|
+
token = TokenManager.new(CharStream.new(StringReader.new('-'))).get_next_token
|
|
50
|
+
assert_equal(TokenManager::DASH, token.kind)
|
|
51
|
+
assert_equal('-', token.image)
|
|
52
|
+
end
|
|
53
|
+
|
|
54
|
+
def test_digits
|
|
55
|
+
token = TokenManager.new(CharStream.new(StringReader.new('4'))).get_next_token
|
|
56
|
+
assert_equal(TokenManager::DIGITS, token.kind)
|
|
57
|
+
assert_equal('4', token.image)
|
|
58
|
+
end
|
|
59
|
+
|
|
60
|
+
def test_dot
|
|
61
|
+
token = TokenManager.new(CharStream.new(StringReader.new('.'))).get_next_token
|
|
62
|
+
assert_equal(TokenManager::DOT, token.kind)
|
|
63
|
+
assert_equal('.', token.image)
|
|
64
|
+
end
|
|
65
|
+
|
|
66
|
+
def test_eol
|
|
67
|
+
token = TokenManager.new(CharStream.new(StringReader.new("\n"))).get_next_token
|
|
68
|
+
assert_equal(TokenManager::EOL, token.kind)
|
|
69
|
+
assert_equal("\n", token.image)
|
|
70
|
+
end
|
|
71
|
+
|
|
72
|
+
def test_eq
|
|
73
|
+
token = TokenManager.new(CharStream.new(StringReader.new('='))).get_next_token
|
|
74
|
+
assert_equal(TokenManager::EQ, token.kind)
|
|
75
|
+
assert_equal('=', token.image)
|
|
76
|
+
end
|
|
77
|
+
|
|
78
|
+
def test_escaped_char
|
|
79
|
+
token = TokenManager.new(CharStream.new(StringReader.new("\\*"))).get_next_token
|
|
80
|
+
assert_equal(TokenManager::ESCAPED_CHAR, token.kind)
|
|
81
|
+
assert_equal("\\*", token.image)
|
|
82
|
+
end
|
|
83
|
+
|
|
84
|
+
def test_gt
|
|
85
|
+
token = TokenManager.new(CharStream.new(StringReader.new('>'))).get_next_token
|
|
86
|
+
assert_equal(TokenManager::GT, token.kind)
|
|
87
|
+
assert_equal('>', token.image)
|
|
88
|
+
end
|
|
89
|
+
|
|
90
|
+
def test_image_label
|
|
91
|
+
token = TokenManager.new(CharStream.new(StringReader.new('image:'))).get_next_token
|
|
92
|
+
assert_equal(TokenManager::IMAGE_LABEL, token.kind)
|
|
93
|
+
assert_equal('image:', token.image)
|
|
94
|
+
end
|
|
95
|
+
|
|
96
|
+
def test_lbrack
|
|
97
|
+
token = TokenManager.new(CharStream.new(StringReader.new('['))).get_next_token
|
|
98
|
+
assert_equal(TokenManager::LBRACK, token.kind)
|
|
99
|
+
assert_equal('[', token.image)
|
|
100
|
+
end
|
|
101
|
+
|
|
102
|
+
def test_lparen
|
|
103
|
+
token = TokenManager.new(CharStream.new(StringReader.new('('))).get_next_token
|
|
104
|
+
assert_equal(TokenManager::LPAREN, token.kind)
|
|
105
|
+
assert_equal('(', token.image)
|
|
106
|
+
end
|
|
107
|
+
|
|
108
|
+
def test_lt
|
|
109
|
+
token = TokenManager.new(CharStream.new(StringReader.new('<'))).get_next_token
|
|
110
|
+
assert_equal(TokenManager::LT, token.kind)
|
|
111
|
+
assert_equal('<', token.image)
|
|
112
|
+
end
|
|
113
|
+
|
|
114
|
+
def test_rbrack
|
|
115
|
+
token = TokenManager.new(CharStream.new(StringReader.new(']'))).get_next_token
|
|
116
|
+
assert_equal(TokenManager::RBRACK, token.kind)
|
|
117
|
+
assert_equal(']', token.image)
|
|
118
|
+
end
|
|
119
|
+
|
|
120
|
+
def test_rparen
|
|
121
|
+
token = TokenManager.new(CharStream.new(StringReader.new(')'))).get_next_token
|
|
122
|
+
assert_equal(TokenManager::RPAREN, token.kind)
|
|
123
|
+
assert_equal(')', token.image)
|
|
124
|
+
end
|
|
125
|
+
|
|
126
|
+
def test_space
|
|
127
|
+
token = TokenManager.new(CharStream.new(StringReader.new(' '))).get_next_token
|
|
128
|
+
assert_equal(TokenManager::SPACE, token.kind)
|
|
129
|
+
assert_equal(' ', token.image)
|
|
130
|
+
end
|
|
131
|
+
|
|
132
|
+
def test_tab
|
|
133
|
+
token = TokenManager.new(CharStream.new(StringReader.new("\t"))).get_next_token
|
|
134
|
+
assert_equal(TokenManager::TAB, token.kind)
|
|
135
|
+
assert_equal("\t", token.image)
|
|
136
|
+
end
|
|
137
|
+
|
|
138
|
+
def test_underscore
|
|
139
|
+
token = TokenManager.new(CharStream.new(StringReader.new('_'))).get_next_token
|
|
140
|
+
assert_equal(TokenManager::UNDERSCORE, token.kind)
|
|
141
|
+
assert_equal('_', token.image)
|
|
142
|
+
end
|
|
143
|
+
|
|
144
|
+
def test_space_after_char_sequence
|
|
145
|
+
tm = TokenManager.new(CharStream.new(StringReader.new('a ')))
|
|
146
|
+
assert_equal('a', tm.get_next_token.image)
|
|
147
|
+
assert_equal(' ', tm.get_next_token.image)
|
|
148
|
+
end
|
|
149
|
+
|
|
150
|
+
def test_two_distinct_char_sequences
|
|
151
|
+
tm = TokenManager.new(CharStream.new(StringReader.new('ði ı')))
|
|
152
|
+
assert_equal('ði', tm.get_next_token.image)
|
|
153
|
+
assert_equal(' ', tm.get_next_token.image)
|
|
154
|
+
assert_equal('ı', tm.get_next_token.image)
|
|
155
|
+
end
|
|
156
|
+
|
|
157
|
+
end
|