livetext 0.9.09 → 0.9.14
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 +4 -4
- data/bin/livetext +0 -1
- data/lib/errors.rb +15 -0
- data/lib/formatline.rb +3 -5
- data/lib/functions.rb +6 -2
- data/lib/helpers.rb +25 -0
- data/lib/html.rb +32 -0
- data/lib/livetext/importable.rb +2 -0
- data/lib/livetext.rb +60 -48
- data/lib/parser/general.rb +38 -0
- data/lib/parser/import.rb +17 -0
- data/lib/parser/mixin.rb +40 -0
- data/lib/parser/set.rb +136 -0
- data/lib/parser/string.rb +55 -0
- data/lib/parser.rb +5 -0
- data/lib/processor.rb +22 -23
- data/lib/standard.rb +145 -298
- data/lib/userapi.rb +2 -5
- data/livetext.gemspec +1 -2
- data/test/all.rb +4 -0
- data/test/formatting-tests.rb +35 -0
- data/test/formatting.rb +2 -9
- data/test/snapshots/OMIT.txt +10 -0
- data/test/{data → snapshots}/basic_formatting/expected-error.txt +0 -0
- data/test/{data → snapshots}/basic_formatting/expected-output.txt +0 -0
- data/test/{data → snapshots}/basic_formatting/source.lt3 +0 -0
- data/test/{data → snapshots}/block_comment/expected-error.txt +0 -0
- data/test/{data → snapshots}/block_comment/expected-output.txt +0 -0
- data/test/{data → snapshots}/block_comment/source.lt3 +0 -0
- data/test/{data → snapshots}/comments_ignored_1/expected-error.txt +0 -0
- data/test/{data → snapshots}/comments_ignored_1/expected-output.txt +0 -0
- data/test/{data → snapshots}/comments_ignored_1/source.lt3 +0 -0
- data/test/{data → snapshots}/copy_is_raw/expected-error.txt +0 -0
- data/test/{data → snapshots}/copy_is_raw/expected-output.txt +0 -0
- data/test/{data → snapshots}/copy_is_raw/rawtext.inc +0 -0
- data/test/{data → snapshots}/copy_is_raw/source.lt3 +0 -0
- data/test/{data → snapshots}/crap +0 -0
- data/test/{data → snapshots}/def_method/expected-error.txt +0 -0
- data/test/{data → snapshots}/def_method/expected-output.txt +0 -0
- data/test/{data → snapshots}/def_method/source.lt3 +0 -0
- data/test/{data → snapshots}/error_inc_line_num/expected-output.txt +6 -0
- data/test/{data → snapshots}/error_inc_line_num/file2.lt3 +0 -0
- data/test/snapshots/error_inc_line_num/match-error.txt +1 -0
- data/test/{data → snapshots}/error_inc_line_num/source.lt3 +0 -0
- data/test/{data → snapshots}/error_invalid_name/expected-output.txt +0 -0
- data/test/snapshots/error_invalid_name/match-error.txt +1 -0
- data/test/{data → snapshots}/error_invalid_name/source.lt3 +0 -0
- data/test/{data → snapshots}/error_line_num/expected-output.txt +0 -0
- data/test/snapshots/error_line_num/match-error.txt +1 -0
- data/test/{data → snapshots}/error_line_num/source.lt3 +0 -0
- data/test/{data → snapshots}/error_mismatched_end/expected-output.txt +0 -0
- data/test/snapshots/error_mismatched_end/match-error.txt +1 -0
- data/test/{data → snapshots}/error_mismatched_end/source.lt3 +0 -0
- data/test/{data → snapshots}/error_missing_end/expected-output.txt +1 -0
- data/test/snapshots/error_missing_end/match-error.txt +1 -0
- data/test/{data → snapshots}/error_missing_end/source.lt3 +0 -0
- data/test/{data/error_no_such_mixin → snapshots/error_name_not_permitted}/expected-output.txt +0 -0
- data/test/snapshots/error_name_not_permitted/match-error.txt +1 -0
- data/test/{data → snapshots}/error_name_not_permitted/source.lt3 +0 -0
- data/test/{data → snapshots}/error_no_such_copy/expected-output.txt +0 -1
- data/test/snapshots/error_no_such_copy/match-error.txt +1 -0
- data/test/{data → snapshots}/error_no_such_copy/source.lt3 +1 -0
- data/test/{data → snapshots}/error_no_such_inc/expected-output.txt +0 -0
- data/test/snapshots/error_no_such_inc/match-error.txt +1 -0
- data/test/{data → snapshots}/error_no_such_inc/source.lt3 +0 -0
- data/test/snapshots/error_no_such_mixin/expected-output.txt +5 -0
- data/test/snapshots/error_no_such_mixin/match-error.txt +1 -0
- data/test/{data → snapshots}/error_no_such_mixin/source.lt3 +0 -0
- data/test/{data → snapshots}/example_alpha/expected-error.txt +0 -0
- data/test/{data → snapshots}/example_alpha/expected-output.txt +0 -0
- data/test/{data → snapshots}/example_alpha/source.lt3 +0 -0
- data/test/{data → snapshots}/example_alpha2/expected-error.txt +0 -0
- data/test/{data → snapshots}/example_alpha2/expected-output.txt +0 -0
- data/test/{data → snapshots}/example_alpha2/source.lt3 +0 -0
- data/test/{data → snapshots}/fixit +0 -0
- data/test/{data/lines.txt → snapshots/formatting-tests.txt} +4 -0
- data/test/{data → snapshots}/functions/expected-error.txt +0 -0
- data/test/{data → snapshots}/functions/expected-output.txt +0 -0
- data/test/{data → snapshots}/functions/source.lt3 +0 -0
- data/test/{data → snapshots}/hello_world/expected-error.txt +0 -0
- data/test/{data → snapshots}/hello_world/expected-output.txt +0 -0
- data/test/{data → snapshots}/hello_world/source.lt3 +0 -0
- data/test/{data → snapshots}/more_complex_vars/expected-error.txt +0 -0
- data/test/{data → snapshots}/more_complex_vars/expected-output.txt +0 -0
- data/test/{data → snapshots}/more_complex_vars/source.lt3 +0 -0
- data/test/{data/raw_lines → snapshots/predef_vars}/expected-error.txt +0 -0
- data/test/snapshots/predef_vars/match-output.txt +6 -0
- data/test/snapshots/predef_vars/source.lt3 +6 -0
- data/test/{data/raw_text_block → snapshots/raw_lines}/expected-error.txt +0 -0
- data/test/{data → snapshots}/raw_lines/expected-output.txt +0 -0
- data/test/{data → snapshots}/raw_lines/source.lt3 +0 -0
- data/test/{data/simple_copy → snapshots/raw_text_block}/expected-error.txt +0 -0
- data/test/{data → snapshots}/raw_text_block/expected-output.txt +0 -0
- data/test/{data → snapshots}/raw_text_block/rawtext.inc +0 -0
- data/test/{data → snapshots}/raw_text_block/source.lt3 +0 -0
- data/test/{data/simple_include → snapshots/simple_copy}/expected-error.txt +0 -0
- data/test/{data → snapshots}/simple_copy/expected-output.txt +0 -0
- data/test/{data → snapshots}/simple_copy/simplefile.inc +0 -0
- data/test/{data → snapshots}/simple_copy/source.lt3 +0 -0
- data/test/{data/simple_mixin → snapshots/simple_include}/expected-error.txt +0 -0
- data/test/{data → snapshots}/simple_include/expected-output.txt +0 -0
- data/test/{data → snapshots}/simple_include/simplefile.inc +0 -0
- data/test/{data → snapshots}/simple_include/source.lt3 +0 -0
- data/test/{data/simple_vars → snapshots/simple_mixin}/expected-error.txt +0 -0
- data/test/{data → snapshots}/simple_mixin/expected-output.txt +0 -0
- data/test/{data → snapshots}/simple_mixin/simple_mixin.rb +0 -0
- data/test/{data → snapshots}/simple_mixin/source.lt3 +0 -0
- data/test/{data/single_raw_line → snapshots/simple_vars}/expected-error.txt +0 -0
- data/test/{data → snapshots}/simple_vars/expected-output.txt +0 -0
- data/test/{data → snapshots}/simple_vars/source.lt3 +0 -0
- data/test/{data/table_with_heredocs → snapshots/single_raw_line}/expected-error.txt +0 -0
- data/test/{data → snapshots}/single_raw_line/expected-output.txt +0 -0
- data/test/{data → snapshots}/single_raw_line/source.lt3 +0 -0
- data/test/{data → snapshots}/subset.txt +0 -0
- data/test/snapshots/table_with_heredocs/expected-error.txt +0 -0
- data/test/{data → snapshots}/table_with_heredocs/expected-output.txt +0 -0
- data/test/{data → snapshots}/table_with_heredocs/source.lt3 +0 -0
- data/test/snapshots.rb +168 -0
- data/test/testlines.rb +17 -7
- data/test/unit/all.rb +3 -0
- data/test/unit/html.rb +38 -0
- data/test/unit/parser/all.rb +3 -0
- data/test/unit/parser/general.rb +59 -0
- data/test/unit/parser/importable.rb +19 -0
- data/test/unit/parser/mixin.rb +19 -0
- data/test/unit/parser/set.rb +157 -0
- data/test/unit/parser/string.rb +130 -0
- data/test/unit/parser.rb +6 -0
- data/test/unit/standard.rb +23 -0
- data/test/unit/stringparser.rb +140 -0
- metadata +122 -96
- data/test/data/error_inc_line_num/expected-err-line1match.txt +0 -1
- data/test/data/error_invalid_name/expected-err-line1match.txt +0 -1
- data/test/data/error_line_num/expected-err-line1match.txt +0 -1
- data/test/data/error_mismatched_end/expected-err-line1match.txt +0 -1
- data/test/data/error_missing_end/expected-err-line1match.txt +0 -1
- data/test/data/error_name_not_permitted/expected-error.txt +0 -1
- data/test/data/error_name_not_permitted/expected-output.txt +0 -4
- data/test/data/error_no_such_copy/expected-err-line1match.txt +0 -1
- data/test/data/error_no_such_inc/expected-err-line1match.txt +0 -1
- data/test/data/error_no_such_mixin/expected-err-line1match.txt +0 -1
- data/test/extratests.txt +0 -20
- data/test/test.rb +0 -140
@@ -0,0 +1,59 @@
|
|
1
|
+
|
2
|
+
require 'minitest/autorun'
|
3
|
+
|
4
|
+
require_relative '../../../lib/parser/general'
|
5
|
+
|
6
|
+
ParseGeneral = ::Livetext::ParseGeneral
|
7
|
+
|
8
|
+
class TestParseGeneral < MiniTest::Test
|
9
|
+
|
10
|
+
def setup
|
11
|
+
end
|
12
|
+
|
13
|
+
def teardown
|
14
|
+
end
|
15
|
+
|
16
|
+
def test_strip_quotes
|
17
|
+
assert_raises(NilValue) { ParseGeneral.new(nil).strip_quotes }
|
18
|
+
assert_raises(NullString) { ParseGeneral.new("").strip_quotes }
|
19
|
+
assert_raises(MismatchedQuotes) { ParseGeneral.new(%['test]).strip_quotes }
|
20
|
+
# assert_raises(MismatchedQuotes) { ParseGeneral.new(%[test']).strip_quotes }
|
21
|
+
assert_raises(MismatchedQuotes) { ParseGeneral.new(%["test]).strip_quotes }
|
22
|
+
# assert_raises(MismatchedQuotes) { ParseGeneral.new(%[test"]).strip_quotes }
|
23
|
+
assert_raises(MismatchedQuotes) { ParseGeneral.new(%["test']).strip_quotes }
|
24
|
+
assert_raises(MismatchedQuotes) { ParseGeneral.new(%['test"]).strip_quotes }
|
25
|
+
|
26
|
+
assert ParseGeneral.new(%[24601]).strip_quotes == "24601", "Failure 1"
|
27
|
+
assert ParseGeneral.new(%[3.14]).strip_quotes == "3.14", "Failure 2"
|
28
|
+
assert ParseGeneral.new(%[test]).strip_quotes == "test", "Failure 3"
|
29
|
+
assert ParseGeneral.new(%['test']).strip_quotes == "test", "Failure 4"
|
30
|
+
assert ParseGeneral.new(%["test"]).strip_quotes == "test", "Failure 5"
|
31
|
+
end
|
32
|
+
|
33
|
+
def test_variables
|
34
|
+
vars = ["foo 234\n", "bar 456\n"]
|
35
|
+
expect = [%w[foo 234], %w[bar 456]]
|
36
|
+
assert_equal ParseGeneral.parse_vars(vars), expect
|
37
|
+
|
38
|
+
vars = ["foo2 234", "bar2 456"] # newline irrelevant
|
39
|
+
expect = [%w[foo2 234], %w[bar2 456]]
|
40
|
+
assert_equal ParseGeneral.parse_vars(vars), expect
|
41
|
+
|
42
|
+
# quotes are not stripped... hmm
|
43
|
+
vars = ["alpha 'simple string'", 'beta "another string"']
|
44
|
+
expect = [["alpha", "'simple string'"], ["beta", '"another string"']]
|
45
|
+
assert_equal ParseGeneral.parse_vars(vars), expect
|
46
|
+
|
47
|
+
# prefix (namespacing)
|
48
|
+
vars = ["alpha 'simple string'", 'beta "another string"']
|
49
|
+
expect = [["this.alpha", "'simple string'"], ["this.beta", '"another string"']]
|
50
|
+
assert_equal ParseGeneral.parse_vars(vars, prefix: "this"), expect
|
51
|
+
|
52
|
+
# prefix (namespacing)
|
53
|
+
vars = ["alpha 'simple string'", 'beta "another string"']
|
54
|
+
expect = [["this.that.alpha", "'simple string'"], ["this.that.beta", '"another string"']]
|
55
|
+
assert_equal ParseGeneral.parse_vars(vars, prefix: "this.that"), expect
|
56
|
+
|
57
|
+
end
|
58
|
+
|
59
|
+
end
|
@@ -0,0 +1,19 @@
|
|
1
|
+
|
2
|
+
require 'minitest/autorun'
|
3
|
+
|
4
|
+
require_relative '../../../lib/parser/set'
|
5
|
+
|
6
|
+
ParseSet = Livetext::ParseSet
|
7
|
+
|
8
|
+
class TestParseSet < MiniTest::Test
|
9
|
+
|
10
|
+
def setup
|
11
|
+
end
|
12
|
+
|
13
|
+
def teardown
|
14
|
+
end
|
15
|
+
|
16
|
+
# FIXME no tests yet
|
17
|
+
# Bad syntax? File not found? not found searching upward?
|
18
|
+
|
19
|
+
end
|
@@ -0,0 +1,19 @@
|
|
1
|
+
|
2
|
+
require 'minitest/autorun'
|
3
|
+
|
4
|
+
require_relative '../../../lib/parser/set'
|
5
|
+
|
6
|
+
ParseSet = Livetext::ParseSet
|
7
|
+
|
8
|
+
class TestParseSet < MiniTest::Test
|
9
|
+
|
10
|
+
def setup
|
11
|
+
end
|
12
|
+
|
13
|
+
def teardown
|
14
|
+
end
|
15
|
+
|
16
|
+
# FIXME no tests yet
|
17
|
+
# Bad syntax? File not found? not found searching upward?
|
18
|
+
|
19
|
+
end
|
@@ -0,0 +1,157 @@
|
|
1
|
+
|
2
|
+
require 'minitest/autorun'
|
3
|
+
|
4
|
+
require_relative '../../../lib/parser/set'
|
5
|
+
|
6
|
+
ParseSet = Livetext::ParseSet
|
7
|
+
|
8
|
+
class TestParseSet < MiniTest::Test
|
9
|
+
|
10
|
+
def setup
|
11
|
+
end
|
12
|
+
|
13
|
+
def teardown
|
14
|
+
end
|
15
|
+
|
16
|
+
def test_one_unquoted
|
17
|
+
set = ParseSet.new('my_var_123 = 789').parse
|
18
|
+
pair = set.first
|
19
|
+
assert_equal pair, %w[my_var_123 789]
|
20
|
+
|
21
|
+
set = ParseSet.new('var_234 = naked_string').parse
|
22
|
+
pair = set.first
|
23
|
+
assert_equal pair, %w[var_234 naked_string]
|
24
|
+
end
|
25
|
+
|
26
|
+
def test_one_single_quoted
|
27
|
+
set = ParseSet.new("fancy.var.name = 'simple string'").parse
|
28
|
+
pair = set.first
|
29
|
+
assert_equal pair, ["fancy.var.name", "simple string"]
|
30
|
+
end
|
31
|
+
|
32
|
+
def test_one_double_quoted
|
33
|
+
set = ParseSet.new('fancy.var2 = "another string"').parse
|
34
|
+
pair = set.first
|
35
|
+
assert_equal pair, ["fancy.var2", "another string"]
|
36
|
+
end
|
37
|
+
|
38
|
+
def test_multiple_unquoted
|
39
|
+
pair1, pair2 = ParseSet.new("this=345, that=678").parse
|
40
|
+
assert_equal pair1, %w[this 345]
|
41
|
+
assert_equal pair2, %w[that 678]
|
42
|
+
end
|
43
|
+
|
44
|
+
def test_multiple_unquoted_quoted
|
45
|
+
pair1, pair2 = ParseSet.new('alpha = 567, beta = "oh well"').parse
|
46
|
+
assert_equal pair1, %w[alpha 567]
|
47
|
+
assert_equal pair2, ["beta", "oh well"]
|
48
|
+
end
|
49
|
+
|
50
|
+
def test_quote_embedded_comma
|
51
|
+
set = ParseSet.new('gamma = "oh, well"').parse
|
52
|
+
pair = set.first
|
53
|
+
assert_equal pair, ["gamma", "oh, well"]
|
54
|
+
end
|
55
|
+
|
56
|
+
def test_get_var
|
57
|
+
@parse = ParseSet.new("foo=345")
|
58
|
+
assert_equal @parse.get_var, "foo"
|
59
|
+
@parse = ParseSet.new("foo = 345")
|
60
|
+
assert_equal @parse.get_var, "foo"
|
61
|
+
@parse = ParseSet.new("foo123 = 345")
|
62
|
+
assert_equal @parse.get_var, "foo123"
|
63
|
+
@parse = ParseSet.new("foo_bar = 345")
|
64
|
+
assert_equal @parse.get_var, "foo_bar"
|
65
|
+
@parse = ParseSet.new("Foobar = 345")
|
66
|
+
assert_equal @parse.get_var, "Foobar"
|
67
|
+
@parse = ParseSet.new("_foobar = 345")
|
68
|
+
assert_equal @parse.get_var, "_foobar"
|
69
|
+
|
70
|
+
# will not notice missing equal sign till later parsing
|
71
|
+
@parse = ParseSet.new("foo bar")
|
72
|
+
assert_equal @parse.get_var, "foo"
|
73
|
+
|
74
|
+
# can detect missing equal sign if iteration ends
|
75
|
+
@parse = ParseSet.new("foo")
|
76
|
+
assert_raises(NoEqualSign) { @parse.get_var }
|
77
|
+
@parse = ParseSet.new("foo-bar = 345")
|
78
|
+
assert_raises(BadVariableName) { @parse.get_var }
|
79
|
+
end
|
80
|
+
|
81
|
+
def test_skip_equal
|
82
|
+
@parse = ParseSet.new("=")
|
83
|
+
assert_nil @parse.skip_equal
|
84
|
+
@parse = ParseSet.new(" = ")
|
85
|
+
assert_nil @parse.skip_equal
|
86
|
+
@parse = ParseSet.new(" =")
|
87
|
+
assert_nil @parse.skip_equal
|
88
|
+
@parse = ParseSet.new(" = 345")
|
89
|
+
assert_equal @parse.skip_equal, "3"
|
90
|
+
@parse = ParseSet.new(" = 'meh'")
|
91
|
+
assert_equal @parse.skip_equal, "'"
|
92
|
+
|
93
|
+
@parse = ParseSet.new("no equal here")
|
94
|
+
assert_raises(NoEqualSign) { @parse.skip_equal }
|
95
|
+
@parse = ParseSet.new("")
|
96
|
+
assert_raises(NoEqualSign) { @parse.skip_equal }
|
97
|
+
end
|
98
|
+
|
99
|
+
def test_quoted_value
|
100
|
+
@parse = ParseSet.new(%['this'])
|
101
|
+
assert_equal @parse.quoted_value, "this"
|
102
|
+
@parse = ParseSet.new(%["that"])
|
103
|
+
assert_equal @parse.quoted_value, "that"
|
104
|
+
@parse = ParseSet.new(%[""])
|
105
|
+
assert_equal @parse.quoted_value, ""
|
106
|
+
@parse = ParseSet.new(%[''])
|
107
|
+
assert_equal @parse.quoted_value, ""
|
108
|
+
|
109
|
+
@parse = ParseSet.new(%['foo"])
|
110
|
+
assert_raises(BadQuotedString) { @parse.quoted_value }
|
111
|
+
@parse = ParseSet.new(%["bar'])
|
112
|
+
assert_raises(BadQuotedString) { @parse.quoted_value }
|
113
|
+
@parse = ParseSet.new(%['baz])
|
114
|
+
assert_raises(BadQuotedString) { @parse.quoted_value }
|
115
|
+
@parse = ParseSet.new(%["bam])
|
116
|
+
assert_raises(BadQuotedString) { @parse.quoted_value }
|
117
|
+
# LATER:
|
118
|
+
# - allow (escaped?) comma in quoted string
|
119
|
+
end
|
120
|
+
|
121
|
+
def test_unquoted_value
|
122
|
+
# Note: an unquoted value is still a string!
|
123
|
+
@parse = ParseSet.new(%[342 ])
|
124
|
+
assert_equal @parse.unquoted_value, "342"
|
125
|
+
@parse = ParseSet.new(%[343,])
|
126
|
+
assert_equal @parse.unquoted_value, "343"
|
127
|
+
@parse = ParseSet.new(%[344,678])
|
128
|
+
assert_equal @parse.unquoted_value, "344"
|
129
|
+
@parse = ParseSet.new(%[345.123])
|
130
|
+
assert_equal @parse.unquoted_value, "345.123"
|
131
|
+
@parse = ParseSet.new(%[whatever])
|
132
|
+
assert_equal @parse.unquoted_value, "whatever"
|
133
|
+
|
134
|
+
# LATER:
|
135
|
+
# - disallow comma in unquoted string
|
136
|
+
# - disallow quote trailing unquoted string
|
137
|
+
# - allow/disallow escaping??
|
138
|
+
end
|
139
|
+
|
140
|
+
# BUG: FormatLine doesn't know variables in this context!
|
141
|
+
|
142
|
+
def xtest_4
|
143
|
+
set = ParseSet.new("file = $File").parse
|
144
|
+
assert_equal set.first, "file"
|
145
|
+
assert set.last !~ /undefined/
|
146
|
+
end
|
147
|
+
|
148
|
+
# BUG: ...or functions.
|
149
|
+
# (Additional bug: Failing silently seems wrong.)
|
150
|
+
|
151
|
+
def xtest_5
|
152
|
+
set = ParseSet.new("date = $$date").parse
|
153
|
+
assert_equal set.first, "date"
|
154
|
+
assert set.last =~ /^\d\d.\d\d.\d\d/
|
155
|
+
end
|
156
|
+
|
157
|
+
end
|
@@ -0,0 +1,130 @@
|
|
1
|
+
require 'minitest/autorun'
|
2
|
+
|
3
|
+
require_relative '../../../lib/parser/string'
|
4
|
+
|
5
|
+
class TestStringParser < MiniTest::Test
|
6
|
+
|
7
|
+
def setup
|
8
|
+
# Lengths: zero, one, arbitrary
|
9
|
+
@str0 = ""
|
10
|
+
@str1 = "x"
|
11
|
+
@strN = "This is a test"
|
12
|
+
@zero = StringParser.new(@str0)
|
13
|
+
@one = StringParser.new(@str1)
|
14
|
+
@many = StringParser.new(@strN)
|
15
|
+
end
|
16
|
+
|
17
|
+
def teardown
|
18
|
+
# Line and length are invariants
|
19
|
+
assert_equal @zero.len, 0
|
20
|
+
assert_equal @one.len, 1
|
21
|
+
assert_equal @many.len, 14
|
22
|
+
end
|
23
|
+
|
24
|
+
def test_init
|
25
|
+
assert_equal @zero.line, ""
|
26
|
+
assert @zero.eos, "EOS was initially false for #{@zero.inspect}"
|
27
|
+
assert_equal @zero.i, 0
|
28
|
+
|
29
|
+
assert_equal @one.line, "x"
|
30
|
+
refute @one.eos, "EOS was initially true for #{@one.inspect}"
|
31
|
+
assert_equal @one.i, 0
|
32
|
+
|
33
|
+
assert_equal @many.line, "This is a test"
|
34
|
+
refute @many.eos, "EOS was initially true for #{@many.inspect}"
|
35
|
+
assert_equal @many.i, 0
|
36
|
+
end
|
37
|
+
|
38
|
+
def test_next
|
39
|
+
assert_nil @zero.next
|
40
|
+
assert_equal @zero.i, 0 # nothing happens
|
41
|
+
|
42
|
+
assert_equal @one.next, "x"
|
43
|
+
assert_equal @one.i, 1
|
44
|
+
|
45
|
+
assert_equal @many.next, "T"
|
46
|
+
refute @many.eos, "EOS was true for #{@many.inspect}"
|
47
|
+
assert_equal @many.i, 1
|
48
|
+
end
|
49
|
+
|
50
|
+
def test_eos
|
51
|
+
assert @zero.eos?
|
52
|
+
refute @one.eos?
|
53
|
+
refute @many.eos?
|
54
|
+
end
|
55
|
+
|
56
|
+
def test_next_eos
|
57
|
+
@zero.next
|
58
|
+
assert @zero.eos?
|
59
|
+
|
60
|
+
@one.next
|
61
|
+
assert @one.eos?
|
62
|
+
@one.next
|
63
|
+
assert @one.eos?
|
64
|
+
|
65
|
+
@many.next
|
66
|
+
refute @many.eos?
|
67
|
+
count = @many.len # doesn't make sense??
|
68
|
+
count.times { @many.next }
|
69
|
+
assert @many.eos?
|
70
|
+
end
|
71
|
+
|
72
|
+
def test_peek
|
73
|
+
assert_nil @zero.peek
|
74
|
+
assert_equal @one.peek, @str1[0]
|
75
|
+
assert_equal @many.peek, @strN[0]
|
76
|
+
end
|
77
|
+
|
78
|
+
def test_next_peek
|
79
|
+
char1 = @zero.next
|
80
|
+
char2 = @zero.peek
|
81
|
+
assert_nil char1
|
82
|
+
assert_nil char2
|
83
|
+
assert @zero.i == 0
|
84
|
+
assert @zero.last?
|
85
|
+
assert @zero.eos?
|
86
|
+
|
87
|
+
refute @one.last? # FIXME??
|
88
|
+
char1 = @one.peek
|
89
|
+
refute @one.last? # FIXME??
|
90
|
+
char2 = @one.next
|
91
|
+
char3 = @one.peek
|
92
|
+
assert char1
|
93
|
+
assert char2 == char1
|
94
|
+
assert char3 == @str1[1]
|
95
|
+
assert @one.i == 1
|
96
|
+
assert @one.last?
|
97
|
+
assert @one.eos? # FIXME??
|
98
|
+
|
99
|
+
char1 = @many.peek
|
100
|
+
char2 = @many.next
|
101
|
+
char3 = @many.peek
|
102
|
+
assert char1
|
103
|
+
assert char2 == char1
|
104
|
+
assert char3 == @strN[1]
|
105
|
+
assert @many.i == 1
|
106
|
+
refute @many.last?
|
107
|
+
refute @many.eos?
|
108
|
+
end
|
109
|
+
|
110
|
+
def test_skip_spaces
|
111
|
+
none = StringParser.new("abc")
|
112
|
+
char, index = none.peek, none.i
|
113
|
+
none.skip_spaces
|
114
|
+
refute none.peek == " "
|
115
|
+
assert_equal none.peek, char
|
116
|
+
assert_equal none.i, index
|
117
|
+
|
118
|
+
one = StringParser.new(" def")
|
119
|
+
one.skip_spaces
|
120
|
+
refute one.peek == " "
|
121
|
+
assert_equal one.peek, "d"
|
122
|
+
assert_equal one.i, 1
|
123
|
+
|
124
|
+
some = StringParser.new(" xyz")
|
125
|
+
some.skip_spaces
|
126
|
+
refute some.peek == " "
|
127
|
+
assert_equal some.peek, "x"
|
128
|
+
assert_equal some.i, 3
|
129
|
+
end
|
130
|
+
end
|
data/test/unit/parser.rb
ADDED
@@ -0,0 +1,23 @@
|
|
1
|
+
require 'minitest/autorun'
|
2
|
+
|
3
|
+
|
4
|
+
require_relative '../../lib/livetext'
|
5
|
+
|
6
|
+
class TestingLivetext < MiniTest::Test
|
7
|
+
include Livetext::Standard
|
8
|
+
include Livetext::UserAPI
|
9
|
+
|
10
|
+
# Only method here "really" belongs elsewhere? FIXME
|
11
|
+
|
12
|
+
def test_onoff
|
13
|
+
refute onoff('off'), "Expected onoff('off') to be false"
|
14
|
+
assert onoff('on'), "Expected onoff('on') to be true"
|
15
|
+
refute onoff('oFf'), "Expected onoff('oFf') to be false"
|
16
|
+
assert onoff('oN'), "Expected onoff('oN') to be true"
|
17
|
+
assert onoff(nil), "Expected onoff(nil) to be true"
|
18
|
+
|
19
|
+
assert_raises(ExpectedOnOff, "Should raise ExpectedOnOff") { onoff("") }
|
20
|
+
assert_raises(ExpectedOnOff, "Should raise ExpectedOnOff") { onoff(345) }
|
21
|
+
end
|
22
|
+
|
23
|
+
end
|
@@ -0,0 +1,140 @@
|
|
1
|
+
require 'minitest/autorun'
|
2
|
+
|
3
|
+
require_relative '../../lib/stringparser'
|
4
|
+
|
5
|
+
class TestStringParser < MiniTest::Test
|
6
|
+
|
7
|
+
def setup
|
8
|
+
# Lengths: zero, one, arbitrary
|
9
|
+
@str0 = ""
|
10
|
+
@str1 = "x"
|
11
|
+
@strN = "This is a test"
|
12
|
+
@zero = StringParser.new(@str0)
|
13
|
+
@one = StringParser.new(@str1)
|
14
|
+
@many = StringParser.new(@strN)
|
15
|
+
end
|
16
|
+
|
17
|
+
def teardown
|
18
|
+
# Line and length are invariants
|
19
|
+
assert_equal @zero.len, 0
|
20
|
+
assert_equal @one.len, 1
|
21
|
+
assert_equal @many.len, 14
|
22
|
+
end
|
23
|
+
|
24
|
+
def test_init
|
25
|
+
assert_equal @zero.line, ""
|
26
|
+
assert @zero.eos, "EOS was initially false for #{@zero.inspect}"
|
27
|
+
assert_equal @zero.i, 0
|
28
|
+
|
29
|
+
assert_equal @one.line, "x"
|
30
|
+
refute @one.eos, "EOS was initially true for #{@one.inspect}"
|
31
|
+
assert_equal @one.i, 0
|
32
|
+
|
33
|
+
assert_equal @many.line, "This is a test"
|
34
|
+
refute @many.eos, "EOS was initially true for #{@many.inspect}"
|
35
|
+
assert_equal @many.i, 0
|
36
|
+
end
|
37
|
+
|
38
|
+
def test_next
|
39
|
+
assert_nil @zero.next
|
40
|
+
assert_equal @zero.i, 0 # nothing happens
|
41
|
+
|
42
|
+
assert_equal @one.next, "x"
|
43
|
+
assert_equal @one.i, 1
|
44
|
+
|
45
|
+
assert_equal @many.next, "T"
|
46
|
+
refute @many.eos, "EOS was true for #{@many.inspect}"
|
47
|
+
assert_equal @many.i, 1
|
48
|
+
end
|
49
|
+
|
50
|
+
def test_eos
|
51
|
+
assert @zero.eos?
|
52
|
+
refute @one.eos?
|
53
|
+
refute @many.eos?
|
54
|
+
end
|
55
|
+
|
56
|
+
def test_next_eos
|
57
|
+
@zero.next
|
58
|
+
assert @zero.eos?
|
59
|
+
|
60
|
+
@one.eos?
|
61
|
+
refute @one.eos?
|
62
|
+
@one.next
|
63
|
+
assert @one.eos?
|
64
|
+
@one.next # One beyond the actual end
|
65
|
+
assert @one.eos? # Still the end
|
66
|
+
|
67
|
+
@many.next
|
68
|
+
refute @many.eos?
|
69
|
+
count = @many.len # doesn't make sense??
|
70
|
+
count.times { @many.next }
|
71
|
+
assert @many.eos?
|
72
|
+
end
|
73
|
+
|
74
|
+
def test_peek
|
75
|
+
assert_nil @zero.peek
|
76
|
+
assert_equal @one.peek, @str1[0]
|
77
|
+
assert_equal @many.peek, @strN[0]
|
78
|
+
end
|
79
|
+
|
80
|
+
def test_next_peek
|
81
|
+
char1 = @zero.next
|
82
|
+
char2 = @zero.peek
|
83
|
+
assert_nil char1
|
84
|
+
assert_nil char2
|
85
|
+
assert @zero.i == 0
|
86
|
+
assert @zero.last?
|
87
|
+
assert @zero.eos?
|
88
|
+
|
89
|
+
refute @one.last?
|
90
|
+
char1 = @one.peek
|
91
|
+
refute @one.last?
|
92
|
+
char2 = @one.next
|
93
|
+
assert @one.last? # One beyond the last
|
94
|
+
char3 = @one.peek
|
95
|
+
assert char1
|
96
|
+
assert char2 == char1
|
97
|
+
assert char3 == @str1[1]
|
98
|
+
assert @one.i == 1
|
99
|
+
assert @one.last?
|
100
|
+
assert @one.eos?
|
101
|
+
|
102
|
+
char1 = @many.peek
|
103
|
+
char2 = @many.next
|
104
|
+
char3 = @many.peek
|
105
|
+
assert char1
|
106
|
+
assert char2 == char1
|
107
|
+
assert char3 == @strN[1]
|
108
|
+
assert @many.i == 1
|
109
|
+
refute @many.last?
|
110
|
+
refute @many.eos?
|
111
|
+
end
|
112
|
+
|
113
|
+
def test_skip_spaces
|
114
|
+
none = StringParser.new("abc")
|
115
|
+
char, index = none.peek, none.i
|
116
|
+
none.skip_spaces
|
117
|
+
refute none.peek == " "
|
118
|
+
assert_equal none.peek, char
|
119
|
+
assert_equal none.i, index
|
120
|
+
|
121
|
+
one = StringParser.new(" def")
|
122
|
+
one.skip_spaces
|
123
|
+
refute one.peek == " "
|
124
|
+
assert_equal one.peek, "d"
|
125
|
+
assert_equal one.i, 1
|
126
|
+
|
127
|
+
some = StringParser.new(" xyz")
|
128
|
+
some.skip_spaces
|
129
|
+
refute some.peek == " "
|
130
|
+
assert_equal some.peek, "x"
|
131
|
+
assert_equal some.i, 3
|
132
|
+
end
|
133
|
+
|
134
|
+
def test_for_parse_set
|
135
|
+
str = StringParser.new('gamma = "oh, well"')
|
136
|
+
count = str.len # doesn't make sense??
|
137
|
+
count.times { print str.next; }
|
138
|
+
|
139
|
+
end
|
140
|
+
end
|