ajlisp 0.0.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.
- data/LICENSE +23 -0
- data/README.md +33 -0
- data/ajlisp.gemspec +20 -0
- data/lib/ajlisp.rb +128 -0
- data/lib/ajlisp/at_constant_atom.rb +30 -0
- data/lib/ajlisp/context.rb +27 -0
- data/lib/ajlisp/dot_verb_atom.rb +31 -0
- data/lib/ajlisp/file_source.rb +10 -0
- data/lib/ajlisp/fprimitive.rb +23 -0
- data/lib/ajlisp/fprimitive_closure.rb +48 -0
- data/lib/ajlisp/fprimitive_define.rb +30 -0
- data/lib/ajlisp/fprimitive_definef.rb +30 -0
- data/lib/ajlisp/fprimitive_definem.rb +30 -0
- data/lib/ajlisp/fprimitive_do.rb +25 -0
- data/lib/ajlisp/fprimitive_flambda.rb +21 -0
- data/lib/ajlisp/fprimitive_if.rb +34 -0
- data/lib/ajlisp/fprimitive_lambda.rb +21 -0
- data/lib/ajlisp/fprimitive_let.rb +38 -0
- data/lib/ajlisp/fprimitive_macro_closure.rb +13 -0
- data/lib/ajlisp/fprimitive_mlambda.rb +21 -0
- data/lib/ajlisp/fprimitive_quote.rb +19 -0
- data/lib/ajlisp/input_source.rb +37 -0
- data/lib/ajlisp/lexer.rb +132 -0
- data/lib/ajlisp/list.rb +106 -0
- data/lib/ajlisp/named_atom.rb +34 -0
- data/lib/ajlisp/nil_atom.rb +39 -0
- data/lib/ajlisp/parser.rb +80 -0
- data/lib/ajlisp/primitive.rb +19 -0
- data/lib/ajlisp/primitive_add.rb +29 -0
- data/lib/ajlisp/primitive_closure.rb +49 -0
- data/lib/ajlisp/primitive_comparisons.rb +84 -0
- data/lib/ajlisp/primitive_cons.rb +19 -0
- data/lib/ajlisp/primitive_divide.rb +25 -0
- data/lib/ajlisp/primitive_eval.rb +19 -0
- data/lib/ajlisp/primitive_first.rb +19 -0
- data/lib/ajlisp/primitive_list.rb +19 -0
- data/lib/ajlisp/primitive_load.rb +34 -0
- data/lib/ajlisp/primitive_multiply.rb +25 -0
- data/lib/ajlisp/primitive_predicates.rb +58 -0
- data/lib/ajlisp/primitive_rest.rb +19 -0
- data/lib/ajlisp/primitive_subtract.rb +25 -0
- data/lib/ajlisp/string_source.rb +28 -0
- data/lib/ajlisp/token.rb +23 -0
- data/lib/core.lsp +40 -0
- data/test/and.lsp +1 -0
- data/test/append.lsp +1 -0
- data/test/backquote.lsp +7 -0
- data/test/cond.lsp +1 -0
- data/test/define123.lsp +4 -0
- data/test/definem.lsp +1 -0
- data/test/dodefine123.lsp +5 -0
- data/test/mapcond.lsp +13 -0
- data/test/mapfirst.lsp +10 -0
- data/test/mycons.lsp +3 -0
- data/test/test.rb +42 -0
- data/test/test_at_constant_atom.rb +34 -0
- data/test/test_context.rb +37 -0
- data/test/test_dot_verb_atom.rb +29 -0
- data/test/test_evaluate.rb +289 -0
- data/test/test_evaluate_files.rb +136 -0
- data/test/test_file_source.rb +11 -0
- data/test/test_fprimitive_closure.rb +29 -0
- data/test/test_fprimitive_define.rb +65 -0
- data/test/test_fprimitive_definef.rb +20 -0
- data/test/test_fprimitive_definem.rb +20 -0
- data/test/test_fprimitive_do.rb +18 -0
- data/test/test_fprimitive_flambda.rb +15 -0
- data/test/test_fprimitive_if.rb +29 -0
- data/test/test_fprimitive_lambda.rb +15 -0
- data/test/test_fprimitive_let.rb +18 -0
- data/test/test_fprimitive_macro_closure.rb +17 -0
- data/test/test_fprimitive_mlambda.rb +12 -0
- data/test/test_fprimitive_quote.rb +35 -0
- data/test/test_lexer.rb +208 -0
- data/test/test_list.rb +102 -0
- data/test/test_load.rb +74 -0
- data/test/test_named_atom.rb +33 -0
- data/test/test_parser.rb +252 -0
- data/test/test_primitive_add.rb +26 -0
- data/test/test_primitive_closure.rb +29 -0
- data/test/test_primitive_cons.rb +39 -0
- data/test/test_primitive_eval.rb +13 -0
- data/test/test_primitive_first.rb +25 -0
- data/test/test_primitive_list.rb +27 -0
- data/test/test_primitive_rest.rb +29 -0
- data/test/test_string_source.rb +10 -0
- data/test/test_token.rb +14 -0
- metadata +131 -0
@@ -0,0 +1,29 @@
|
|
1
|
+
require 'ajlisp'
|
2
|
+
require 'test/unit'
|
3
|
+
|
4
|
+
class TestFPrimitiveClosure < Test::Unit::TestCase
|
5
|
+
def test_new_with_no_context
|
6
|
+
arguments = AjLisp::List.make [ :a, :b ]
|
7
|
+
body = AjLisp::List.make [[ :cons, :a, :b ]]
|
8
|
+
closure = AjLisp::FPrimitiveClosure.new arguments, body
|
9
|
+
assert_equal arguments, closure.arguments
|
10
|
+
assert_equal body, closure.body
|
11
|
+
assert_nil closure.context
|
12
|
+
end
|
13
|
+
|
14
|
+
def test_evaluate_simple_body
|
15
|
+
arguments = AjLisp::List.make [ :a, :b ]
|
16
|
+
body = [ AjLisp::List.make([ :cons, :a, :b ])]
|
17
|
+
closure = AjLisp::FPrimitiveClosure.new arguments, body
|
18
|
+
list = AjLisp::List.make [closure, "a", [:b, :c]]
|
19
|
+
|
20
|
+
result = closure.evaluate(AjLisp::context, list)
|
21
|
+
|
22
|
+
assert_not_nil result
|
23
|
+
assert result.is_a? AjLisp::List
|
24
|
+
assert_equal "a", result.first
|
25
|
+
assert_equal :b, result.rest.first.name
|
26
|
+
assert_equal :c, result.rest.rest.first.name
|
27
|
+
assert_nil result.rest.rest.rest
|
28
|
+
end
|
29
|
+
end
|
@@ -0,0 +1,65 @@
|
|
1
|
+
require 'ajlisp'
|
2
|
+
require 'test/unit'
|
3
|
+
|
4
|
+
class TestFPrimitiveDefine < Test::Unit::TestCase
|
5
|
+
def test_evaluate_define_atom_as_constant
|
6
|
+
list = AjLisp::List.make [AjLisp::FPrimitiveDefine.instance, :a, 1]
|
7
|
+
|
8
|
+
result = list.evaluate(AjLisp::context)
|
9
|
+
|
10
|
+
assert_equal 1, result
|
11
|
+
assert_equal 1, AjLisp::context.getValue(:a)
|
12
|
+
end
|
13
|
+
|
14
|
+
def test_evaluate_define_two_atoms
|
15
|
+
list = AjLisp::List.make [AjLisp::FPrimitiveDefine.instance, :a, 1]
|
16
|
+
result = list.evaluate(AjLisp::context)
|
17
|
+
|
18
|
+
list = AjLisp::List.make [AjLisp::FPrimitiveDefine.instance, :b, :a]
|
19
|
+
result = list.evaluate(AjLisp::context)
|
20
|
+
|
21
|
+
assert_equal 1, result
|
22
|
+
assert_equal 1, AjLisp::context.getValue(:a)
|
23
|
+
assert_equal 1, AjLisp::context.getValue(:b)
|
24
|
+
end
|
25
|
+
|
26
|
+
def test_evaluate_define_atom_as_lambda
|
27
|
+
list = AjLisp::List.make [AjLisp::FPrimitiveDefine.instance, :mycons, [:lambda, [:a, :b], [:cons, :a, :b]]]
|
28
|
+
|
29
|
+
result = list.evaluate(AjLisp::context)
|
30
|
+
|
31
|
+
assert result.is_a? AjLisp::PrimitiveClosure
|
32
|
+
|
33
|
+
list = AjLisp::List.make [:mycons, 1, [:quote, [:b, :c]]]
|
34
|
+
|
35
|
+
result = list.evaluate(AjLisp::context)
|
36
|
+
|
37
|
+
assert_not_nil result
|
38
|
+
assert result.is_a? AjLisp::List
|
39
|
+
assert_equal 1, result.first
|
40
|
+
assert_equal :b, result.rest.first.name
|
41
|
+
assert_equal :c, result.rest.rest.first.name
|
42
|
+
assert_nil result.rest.rest.rest
|
43
|
+
end
|
44
|
+
|
45
|
+
def test_evaluate_define_form
|
46
|
+
list = AjLisp::List.make [AjLisp::FPrimitiveDefine.instance, :mycons, [:a, :b], [:cons, :a, :b]]
|
47
|
+
|
48
|
+
result = list.evaluate(AjLisp::context)
|
49
|
+
|
50
|
+
assert_not_nil result
|
51
|
+
assert result.is_a? AjLisp::PrimitiveClosure
|
52
|
+
|
53
|
+
list = AjLisp::List.make [:mycons, 1, [:quote, [:b, :c]]]
|
54
|
+
|
55
|
+
result = list.evaluate(AjLisp::context)
|
56
|
+
|
57
|
+
assert_not_nil result
|
58
|
+
assert result.is_a? AjLisp::List
|
59
|
+
assert_equal 1, result.first
|
60
|
+
assert_equal :b, result.rest.first.name
|
61
|
+
assert_equal :c, result.rest.rest.first.name
|
62
|
+
assert_nil result.rest.rest.rest
|
63
|
+
end
|
64
|
+
end
|
65
|
+
|
@@ -0,0 +1,20 @@
|
|
1
|
+
require 'ajlisp'
|
2
|
+
require 'test/unit'
|
3
|
+
|
4
|
+
class TestFPrimitiveDefinef < Test::Unit::TestCase
|
5
|
+
def test_evaluate_definef_form_myquote
|
6
|
+
list = AjLisp::List.make [:definef, :myquote, [:x], :x]
|
7
|
+
|
8
|
+
result = list.evaluate(AjLisp::context)
|
9
|
+
|
10
|
+
assert_not_nil AjLisp::context.getValue(:myquote)
|
11
|
+
|
12
|
+
list = AjLisp::List.make [:myquote, :a]
|
13
|
+
result = list.evaluate(AjLisp::context)
|
14
|
+
|
15
|
+
assert_not_nil result
|
16
|
+
assert result.is_a? AjLisp::NamedAtom
|
17
|
+
assert_equal :a, result.name
|
18
|
+
end
|
19
|
+
end
|
20
|
+
|
@@ -0,0 +1,20 @@
|
|
1
|
+
require 'ajlisp'
|
2
|
+
require 'test/unit'
|
3
|
+
|
4
|
+
class TestFPrimitiveDefinem < Test::Unit::TestCase
|
5
|
+
def test_evaluate_definem_form
|
6
|
+
list = AjLisp::List.make [:definem, :mycompose, [:a, :b], [:list, :a, :b]]
|
7
|
+
|
8
|
+
result = list.evaluate(AjLisp::context)
|
9
|
+
|
10
|
+
assert_not_nil AjLisp::context.getValue(:mycompose)
|
11
|
+
|
12
|
+
list = AjLisp::List.make [:mycompose, :first, [:quote, [:a, :b]]]
|
13
|
+
result = list.evaluate(AjLisp::context)
|
14
|
+
|
15
|
+
assert_not_nil result
|
16
|
+
assert result.is_a? AjLisp::NamedAtom
|
17
|
+
assert_equal :a, result.name
|
18
|
+
end
|
19
|
+
end
|
20
|
+
|
@@ -0,0 +1,18 @@
|
|
1
|
+
require 'ajlisp'
|
2
|
+
require 'test/unit'
|
3
|
+
|
4
|
+
class TestFPrimitiveDo < Test::Unit::TestCase
|
5
|
+
def test_evaluate_simple_body
|
6
|
+
doform = AjLisp::FPrimitiveDo.instance
|
7
|
+
list = AjLisp::List.make [doform, [:define, :a, 1], [:define, :b, 2], [:define, :c, 3] ]
|
8
|
+
|
9
|
+
result = doform.evaluate(AjLisp::context, list)
|
10
|
+
|
11
|
+
assert_not_nil result
|
12
|
+
assert_equal 3, result
|
13
|
+
assert_equal 1, AjLisp::context.getValue(:a)
|
14
|
+
assert_equal 2, AjLisp::context.getValue(:b)
|
15
|
+
assert_equal 3, AjLisp::context.getValue(:c)
|
16
|
+
end
|
17
|
+
end
|
18
|
+
|
@@ -0,0 +1,15 @@
|
|
1
|
+
|
2
|
+
require 'ajlisp'
|
3
|
+
require 'test/unit'
|
4
|
+
|
5
|
+
class TestFPrimitiveFLambda < Test::Unit::TestCase
|
6
|
+
def test_evaluate
|
7
|
+
list = AjLisp::List.make [[:flambda, [:a, :b], [:cons, :a, :b]], "a", [:b, :c]]
|
8
|
+
result = list.evaluate(AjLisp::context)
|
9
|
+
assert result.is_a? AjLisp::List
|
10
|
+
assert_equal "a", result.first
|
11
|
+
assert_equal :b, result.rest.first.name
|
12
|
+
assert_equal :c, result.rest.rest.first.name
|
13
|
+
assert_nil result.rest.rest.rest
|
14
|
+
end
|
15
|
+
end
|
@@ -0,0 +1,29 @@
|
|
1
|
+
require 'ajlisp'
|
2
|
+
require 'test/unit'
|
3
|
+
|
4
|
+
class TestFPrimitiveIf < Test::Unit::TestCase
|
5
|
+
def test_evaluate_if_false
|
6
|
+
ifform = AjLisp::FPrimitiveIf.instance
|
7
|
+
list = AjLisp::List.make [ifform, false, [:define, :b1, 2], [:define, :c1, 3] ]
|
8
|
+
|
9
|
+
result = ifform.evaluate(AjLisp::context, list)
|
10
|
+
|
11
|
+
assert_not_nil result
|
12
|
+
assert_equal 3, result
|
13
|
+
assert_nil AjLisp::context.getValue(:b1)
|
14
|
+
assert_equal 3, AjLisp::context.getValue(:c1)
|
15
|
+
end
|
16
|
+
|
17
|
+
def test_evaluate_if_true
|
18
|
+
ifform = AjLisp::FPrimitiveIf.instance
|
19
|
+
list = AjLisp::List.make [ifform, true, [:define, :b2, 2], [:define, :c2, 3] ]
|
20
|
+
|
21
|
+
result = ifform.evaluate(AjLisp::context, list)
|
22
|
+
|
23
|
+
assert_not_nil result
|
24
|
+
assert_equal 2, result
|
25
|
+
assert_equal 2, AjLisp::context.getValue(:b2)
|
26
|
+
assert_nil AjLisp::context.getValue(:c2)
|
27
|
+
end
|
28
|
+
end
|
29
|
+
|
@@ -0,0 +1,15 @@
|
|
1
|
+
|
2
|
+
require 'ajlisp'
|
3
|
+
require 'test/unit'
|
4
|
+
|
5
|
+
class TestFPrimitiveLambda < Test::Unit::TestCase
|
6
|
+
def test_evaluate
|
7
|
+
list = AjLisp::List.make [[:lambda, [:a, :b], [:cons, :a, :b]], "a", [:quote, [:b, :c]]]
|
8
|
+
result = list.evaluate(AjLisp::context)
|
9
|
+
assert result.is_a? AjLisp::List
|
10
|
+
assert_equal "a", result.first
|
11
|
+
assert_equal :b, result.rest.first.name
|
12
|
+
assert_equal :c, result.rest.rest.first.name
|
13
|
+
assert_nil result.rest.rest.rest
|
14
|
+
end
|
15
|
+
end
|
@@ -0,0 +1,18 @@
|
|
1
|
+
require 'ajlisp'
|
2
|
+
require 'test/unit'
|
3
|
+
|
4
|
+
class TestFPrimitiveLet < Test::Unit::TestCase
|
5
|
+
def test_evaluate_simple_body
|
6
|
+
let = AjLisp::FPrimitiveLet.instance
|
7
|
+
list = AjLisp::List.make [let, [[:a, 1], [:b, 2]], [:cons, :a, [:cons, :b]] ]
|
8
|
+
|
9
|
+
result = let.evaluate(AjLisp::context, list)
|
10
|
+
|
11
|
+
assert_not_nil result
|
12
|
+
assert result.is_a? AjLisp::List
|
13
|
+
assert_equal 1, result.first
|
14
|
+
assert_equal 2, result.rest.first
|
15
|
+
assert_nil result.rest.rest
|
16
|
+
end
|
17
|
+
end
|
18
|
+
|
@@ -0,0 +1,17 @@
|
|
1
|
+
require 'ajlisp'
|
2
|
+
require 'test/unit'
|
3
|
+
|
4
|
+
class TestFPrimitiveMacroClosure < Test::Unit::TestCase
|
5
|
+
def test_evaluate_simple_body
|
6
|
+
arguments = AjLisp::List.make [ :a, :b ]
|
7
|
+
body = [ AjLisp::List.make([ :list, :a, :b ])]
|
8
|
+
mclosure = AjLisp::FPrimitiveMacroClosure.new arguments, body
|
9
|
+
list = AjLisp::List.make [mclosure, :first, [:quote, [:b, :c]]]
|
10
|
+
|
11
|
+
result = mclosure.evaluate(AjLisp::context, list)
|
12
|
+
|
13
|
+
assert_not_nil result
|
14
|
+
assert result.is_a? AjLisp::NamedAtom
|
15
|
+
assert_equal :b, result.name
|
16
|
+
end
|
17
|
+
end
|
@@ -0,0 +1,12 @@
|
|
1
|
+
|
2
|
+
require 'ajlisp'
|
3
|
+
require 'test/unit'
|
4
|
+
|
5
|
+
class TestFPrimitiveMLambda < Test::Unit::TestCase
|
6
|
+
def test_evaluate
|
7
|
+
list = AjLisp::List.make [[:mlambda, [:a, :b], [:list, :a, :b]], :first, [:quote, [:b, :c]]]
|
8
|
+
result = list.evaluate AjLisp::context
|
9
|
+
assert result.is_a? AjLisp::NamedAtom
|
10
|
+
assert_equal :b, result.name
|
11
|
+
end
|
12
|
+
end
|
@@ -0,0 +1,35 @@
|
|
1
|
+
|
2
|
+
require 'ajlisp'
|
3
|
+
require 'test/unit'
|
4
|
+
|
5
|
+
module AjLisp
|
6
|
+
|
7
|
+
class TestFPrimitiveQuote < Test::Unit::TestCase
|
8
|
+
def test_simple_apply
|
9
|
+
list = List.new("a")
|
10
|
+
quote = FPrimitiveQuote.instance
|
11
|
+
result = quote.apply(nil, [list])
|
12
|
+
assert result.is_a? List
|
13
|
+
assert_equal "a", result.first
|
14
|
+
assert_nil result.rest
|
15
|
+
end
|
16
|
+
|
17
|
+
def test_simple_evaluate_with_atom
|
18
|
+
form = List.make [:quote, :a]
|
19
|
+
result = form.evaluate(AjLisp::context)
|
20
|
+
assert_not_nil result
|
21
|
+
assert_equal :a, result.name
|
22
|
+
end
|
23
|
+
|
24
|
+
def test_simple_evaluate_with_list
|
25
|
+
form = List.make [:quote, [:a, :b]]
|
26
|
+
result = form.evaluate(AjLisp::context)
|
27
|
+
assert_not_nil result
|
28
|
+
assert result.is_a? List
|
29
|
+
assert_equal :a, result.first.name
|
30
|
+
assert_equal :b, result.rest.first.name
|
31
|
+
assert_nil result.rest.rest
|
32
|
+
end
|
33
|
+
end
|
34
|
+
|
35
|
+
end
|
data/test/test_lexer.rb
ADDED
@@ -0,0 +1,208 @@
|
|
1
|
+
require 'ajlisp'
|
2
|
+
require 'test/unit'
|
3
|
+
|
4
|
+
module AjLisp
|
5
|
+
|
6
|
+
class TestLexer < Test::Unit::TestCase
|
7
|
+
def test_get_atom_token
|
8
|
+
source = StringSource.new "atom"
|
9
|
+
lexer = Lexer.new source
|
10
|
+
token = lexer.nextToken
|
11
|
+
|
12
|
+
assert_not_nil token
|
13
|
+
assert_equal "atom", token.value
|
14
|
+
assert_equal TokenType::ATOM, token.type
|
15
|
+
assert_nil lexer.nextToken
|
16
|
+
end
|
17
|
+
|
18
|
+
def test_get_atom_token_with_spaces
|
19
|
+
source = StringSource.new " atom "
|
20
|
+
lexer = Lexer.new source
|
21
|
+
token = lexer.nextToken
|
22
|
+
|
23
|
+
assert_not_nil token
|
24
|
+
assert_equal "atom", token.value
|
25
|
+
assert_equal TokenType::ATOM, token.type
|
26
|
+
assert_nil lexer.nextToken
|
27
|
+
end
|
28
|
+
|
29
|
+
def test_get_two_atoms
|
30
|
+
source = StringSource.new "foo bar"
|
31
|
+
lexer = Lexer.new source
|
32
|
+
token = lexer.nextToken
|
33
|
+
|
34
|
+
assert_not_nil token
|
35
|
+
assert_equal "foo", token.value
|
36
|
+
assert_equal TokenType::ATOM, token.type
|
37
|
+
|
38
|
+
token = lexer.nextToken
|
39
|
+
|
40
|
+
assert_not_nil token
|
41
|
+
assert_equal "bar", token.value
|
42
|
+
assert_equal TokenType::ATOM, token.type
|
43
|
+
|
44
|
+
assert_nil lexer.nextToken
|
45
|
+
end
|
46
|
+
|
47
|
+
def test_get_parentheses
|
48
|
+
source = StringSource.new "()"
|
49
|
+
lexer = Lexer.new source
|
50
|
+
token = lexer.nextToken
|
51
|
+
|
52
|
+
assert_not_nil token
|
53
|
+
assert_equal "(", token.value
|
54
|
+
assert_equal TokenType::SEPARATOR, token.type
|
55
|
+
|
56
|
+
token = lexer.nextToken
|
57
|
+
|
58
|
+
assert_not_nil token
|
59
|
+
assert_equal ")", token.value
|
60
|
+
assert_equal TokenType::SEPARATOR, token.type
|
61
|
+
|
62
|
+
assert_nil lexer.nextToken
|
63
|
+
end
|
64
|
+
|
65
|
+
def test_get_integer
|
66
|
+
source = StringSource.new "123"
|
67
|
+
lexer = Lexer.new source
|
68
|
+
token = lexer.nextToken
|
69
|
+
|
70
|
+
assert_not_nil token
|
71
|
+
assert_equal "123", token.value
|
72
|
+
assert_equal TokenType::INTEGER, token.type
|
73
|
+
assert_nil lexer.nextToken
|
74
|
+
end
|
75
|
+
|
76
|
+
def test_get_add
|
77
|
+
source = StringSource.new "+"
|
78
|
+
lexer = Lexer.new source
|
79
|
+
token = lexer.nextToken
|
80
|
+
|
81
|
+
assert_not_nil token
|
82
|
+
assert_equal "+", token.value
|
83
|
+
assert_equal TokenType::ATOM, token.type
|
84
|
+
assert_nil lexer.nextToken
|
85
|
+
end
|
86
|
+
|
87
|
+
def test_get_less_equal
|
88
|
+
source = StringSource.new "<="
|
89
|
+
lexer = Lexer.new source
|
90
|
+
token = lexer.nextToken
|
91
|
+
|
92
|
+
assert_not_nil token
|
93
|
+
assert_equal "<=", token.value
|
94
|
+
assert_equal TokenType::ATOM, token.type
|
95
|
+
assert_nil lexer.nextToken
|
96
|
+
end
|
97
|
+
|
98
|
+
def test_get_quote_and_atom
|
99
|
+
source = StringSource.new "'a"
|
100
|
+
lexer = Lexer.new source
|
101
|
+
token = lexer.nextToken
|
102
|
+
|
103
|
+
assert_not_nil token
|
104
|
+
assert_equal "'", token.value
|
105
|
+
assert_equal TokenType::ATOM, token.type
|
106
|
+
|
107
|
+
token = lexer.nextToken
|
108
|
+
|
109
|
+
assert_not_nil token
|
110
|
+
assert_equal "a", token.value
|
111
|
+
assert_equal TokenType::ATOM, token.type
|
112
|
+
|
113
|
+
assert_nil lexer.nextToken
|
114
|
+
end
|
115
|
+
|
116
|
+
def test_get_backquote_and_atom
|
117
|
+
source = StringSource.new "`a"
|
118
|
+
lexer = Lexer.new source
|
119
|
+
token = lexer.nextToken
|
120
|
+
|
121
|
+
assert_not_nil token
|
122
|
+
assert_equal "`", token.value
|
123
|
+
assert_equal TokenType::ATOM, token.type
|
124
|
+
|
125
|
+
token = lexer.nextToken
|
126
|
+
|
127
|
+
assert_not_nil token
|
128
|
+
assert_equal "a", token.value
|
129
|
+
assert_equal TokenType::ATOM, token.type
|
130
|
+
|
131
|
+
assert_nil lexer.nextToken
|
132
|
+
end
|
133
|
+
|
134
|
+
def test_get_unquote_and_atom
|
135
|
+
source = StringSource.new ",a"
|
136
|
+
lexer = Lexer.new source
|
137
|
+
token = lexer.nextToken
|
138
|
+
|
139
|
+
assert_not_nil token
|
140
|
+
assert_equal ",", token.value
|
141
|
+
assert_equal TokenType::ATOM, token.type
|
142
|
+
|
143
|
+
token = lexer.nextToken
|
144
|
+
|
145
|
+
assert_not_nil token
|
146
|
+
assert_equal "a", token.value
|
147
|
+
assert_equal TokenType::ATOM, token.type
|
148
|
+
|
149
|
+
assert_nil lexer.nextToken
|
150
|
+
end
|
151
|
+
|
152
|
+
def test_get_string
|
153
|
+
source = StringSource.new '"foo"'
|
154
|
+
lexer = Lexer.new source
|
155
|
+
token = lexer.nextToken
|
156
|
+
|
157
|
+
assert_not_nil token
|
158
|
+
assert_equal "foo", token.value
|
159
|
+
assert_equal TokenType::STRING, token.type
|
160
|
+
assert_nil lexer.nextToken
|
161
|
+
end
|
162
|
+
|
163
|
+
def test_get_verb_atom_token
|
164
|
+
source = StringSource.new ".verb"
|
165
|
+
lexer = Lexer.new source
|
166
|
+
token = lexer.nextToken
|
167
|
+
|
168
|
+
assert_not_nil token
|
169
|
+
assert_equal ".verb", token.value
|
170
|
+
assert_equal TokenType::ATOM, token.type
|
171
|
+
assert_nil lexer.nextToken
|
172
|
+
end
|
173
|
+
|
174
|
+
def test_get_verb_atom_token_with_question_mark
|
175
|
+
source = StringSource.new ".include?"
|
176
|
+
lexer = Lexer.new source
|
177
|
+
token = lexer.nextToken
|
178
|
+
|
179
|
+
assert_not_nil token
|
180
|
+
assert_equal ".include?", token.value
|
181
|
+
assert_equal TokenType::ATOM, token.type
|
182
|
+
assert_nil lexer.nextToken
|
183
|
+
end
|
184
|
+
|
185
|
+
def test_get_predicate_atom
|
186
|
+
source = StringSource.new "nil?"
|
187
|
+
lexer = Lexer.new source
|
188
|
+
token = lexer.nextToken
|
189
|
+
|
190
|
+
assert_not_nil token
|
191
|
+
assert_equal "nil?", token.value
|
192
|
+
assert_equal TokenType::ATOM, token.type
|
193
|
+
assert_nil lexer.nextToken
|
194
|
+
end
|
195
|
+
|
196
|
+
def test_get_constant_atom_token
|
197
|
+
source = StringSource.new "@String"
|
198
|
+
lexer = Lexer.new source
|
199
|
+
token = lexer.nextToken
|
200
|
+
|
201
|
+
assert_not_nil token
|
202
|
+
assert_equal "@String", token.value
|
203
|
+
assert_equal TokenType::ATOM, token.type
|
204
|
+
assert_nil lexer.nextToken
|
205
|
+
end
|
206
|
+
end
|
207
|
+
|
208
|
+
end
|