simply_stored 0.1.4

Sign up to get free protection for your applications and to get access to all the features.
Files changed (121) hide show
  1. data/lib/simply_stored/class_methods_base.rb +31 -0
  2. data/lib/simply_stored/couch/belongs_to.rb +117 -0
  3. data/lib/simply_stored/couch/ext/couch_potato.rb +16 -0
  4. data/lib/simply_stored/couch/has_many.rb +148 -0
  5. data/lib/simply_stored/couch/has_one.rb +93 -0
  6. data/lib/simply_stored/couch/validations.rb +74 -0
  7. data/lib/simply_stored/couch/views/array_property_view_spec.rb +22 -0
  8. data/lib/simply_stored/couch/views.rb +1 -0
  9. data/lib/simply_stored/couch.rb +278 -0
  10. data/lib/simply_stored/instance_methods.rb +143 -0
  11. data/lib/simply_stored/simpledb/associations.rb +196 -0
  12. data/lib/simply_stored/simpledb/attributes.rb +173 -0
  13. data/lib/simply_stored/simpledb/storag.rb +85 -0
  14. data/lib/simply_stored/simpledb/validations.rb +88 -0
  15. data/lib/simply_stored/simpledb.rb +212 -0
  16. data/lib/simply_stored/storage.rb +93 -0
  17. data/lib/simply_stored.rb +9 -0
  18. data/test/custom_views_test.rb +33 -0
  19. data/test/fixtures/couch.rb +182 -0
  20. data/test/fixtures/simpledb/item.rb +11 -0
  21. data/test/fixtures/simpledb/item_daddy.rb +8 -0
  22. data/test/fixtures/simpledb/log_item.rb +3 -0
  23. data/test/fixtures/simpledb/namespace_bar.rb +5 -0
  24. data/test/fixtures/simpledb/namespace_foo.rb +7 -0
  25. data/test/fixtures/simpledb/protected_item.rb +3 -0
  26. data/test/simply_stored_couch_test.rb +1684 -0
  27. data/test/simply_stored_simpledb_test.rb +1341 -0
  28. data/test/test_helper.rb +22 -0
  29. data/test/vendor/dhaka-2.2.1/lib/dhaka/dot/dot.rb +29 -0
  30. data/test/vendor/dhaka-2.2.1/lib/dhaka/evaluator/evaluator.rb +133 -0
  31. data/test/vendor/dhaka-2.2.1/lib/dhaka/grammar/closure_hash.rb +15 -0
  32. data/test/vendor/dhaka-2.2.1/lib/dhaka/grammar/grammar.rb +240 -0
  33. data/test/vendor/dhaka-2.2.1/lib/dhaka/grammar/grammar_symbol.rb +27 -0
  34. data/test/vendor/dhaka-2.2.1/lib/dhaka/grammar/precedence.rb +19 -0
  35. data/test/vendor/dhaka-2.2.1/lib/dhaka/grammar/production.rb +36 -0
  36. data/test/vendor/dhaka-2.2.1/lib/dhaka/lexer/accept_actions.rb +36 -0
  37. data/test/vendor/dhaka-2.2.1/lib/dhaka/lexer/alphabet.rb +21 -0
  38. data/test/vendor/dhaka-2.2.1/lib/dhaka/lexer/compiled_lexer.rb +46 -0
  39. data/test/vendor/dhaka-2.2.1/lib/dhaka/lexer/dfa.rb +121 -0
  40. data/test/vendor/dhaka-2.2.1/lib/dhaka/lexer/lexeme.rb +32 -0
  41. data/test/vendor/dhaka-2.2.1/lib/dhaka/lexer/lexer.rb +70 -0
  42. data/test/vendor/dhaka-2.2.1/lib/dhaka/lexer/lexer_run.rb +78 -0
  43. data/test/vendor/dhaka-2.2.1/lib/dhaka/lexer/regex_grammar.rb +392 -0
  44. data/test/vendor/dhaka-2.2.1/lib/dhaka/lexer/regex_parser.rb +2010 -0
  45. data/test/vendor/dhaka-2.2.1/lib/dhaka/lexer/regex_tokenizer.rb +14 -0
  46. data/test/vendor/dhaka-2.2.1/lib/dhaka/lexer/specification.rb +96 -0
  47. data/test/vendor/dhaka-2.2.1/lib/dhaka/lexer/state.rb +68 -0
  48. data/test/vendor/dhaka-2.2.1/lib/dhaka/lexer/state_machine.rb +37 -0
  49. data/test/vendor/dhaka-2.2.1/lib/dhaka/parser/action.rb +55 -0
  50. data/test/vendor/dhaka-2.2.1/lib/dhaka/parser/channel.rb +58 -0
  51. data/test/vendor/dhaka-2.2.1/lib/dhaka/parser/compiled_parser.rb +51 -0
  52. data/test/vendor/dhaka-2.2.1/lib/dhaka/parser/conflict.rb +54 -0
  53. data/test/vendor/dhaka-2.2.1/lib/dhaka/parser/item.rb +42 -0
  54. data/test/vendor/dhaka-2.2.1/lib/dhaka/parser/parse_result.rb +50 -0
  55. data/test/vendor/dhaka-2.2.1/lib/dhaka/parser/parse_tree.rb +66 -0
  56. data/test/vendor/dhaka-2.2.1/lib/dhaka/parser/parser.rb +165 -0
  57. data/test/vendor/dhaka-2.2.1/lib/dhaka/parser/parser_methods.rb +11 -0
  58. data/test/vendor/dhaka-2.2.1/lib/dhaka/parser/parser_run.rb +39 -0
  59. data/test/vendor/dhaka-2.2.1/lib/dhaka/parser/parser_state.rb +74 -0
  60. data/test/vendor/dhaka-2.2.1/lib/dhaka/parser/token.rb +22 -0
  61. data/test/vendor/dhaka-2.2.1/lib/dhaka/runtime.rb +51 -0
  62. data/test/vendor/dhaka-2.2.1/lib/dhaka/tokenizer/tokenizer.rb +190 -0
  63. data/test/vendor/dhaka-2.2.1/lib/dhaka.rb +62 -0
  64. data/test/vendor/dhaka-2.2.1/test/all_tests.rb +5 -0
  65. data/test/vendor/dhaka-2.2.1/test/arithmetic/arithmetic_evaluator.rb +64 -0
  66. data/test/vendor/dhaka-2.2.1/test/arithmetic/arithmetic_evaluator_test.rb +43 -0
  67. data/test/vendor/dhaka-2.2.1/test/arithmetic/arithmetic_grammar.rb +41 -0
  68. data/test/vendor/dhaka-2.2.1/test/arithmetic/arithmetic_grammar_test.rb +9 -0
  69. data/test/vendor/dhaka-2.2.1/test/arithmetic/arithmetic_test_methods.rb +9 -0
  70. data/test/vendor/dhaka-2.2.1/test/arithmetic/arithmetic_tokenizer.rb +39 -0
  71. data/test/vendor/dhaka-2.2.1/test/arithmetic/arithmetic_tokenizer_test.rb +38 -0
  72. data/test/vendor/dhaka-2.2.1/test/arithmetic_precedence/arithmetic_precedence_evaluator.rb +43 -0
  73. data/test/vendor/dhaka-2.2.1/test/arithmetic_precedence/arithmetic_precedence_grammar.rb +24 -0
  74. data/test/vendor/dhaka-2.2.1/test/arithmetic_precedence/arithmetic_precedence_grammar_test.rb +30 -0
  75. data/test/vendor/dhaka-2.2.1/test/arithmetic_precedence/arithmetic_precedence_lexer_specification.rb +23 -0
  76. data/test/vendor/dhaka-2.2.1/test/arithmetic_precedence/arithmetic_precedence_parser_test.rb +33 -0
  77. data/test/vendor/dhaka-2.2.1/test/brackets/bracket_grammar.rb +23 -0
  78. data/test/vendor/dhaka-2.2.1/test/brackets/bracket_tokenizer.rb +22 -0
  79. data/test/vendor/dhaka-2.2.1/test/brackets/brackets_test.rb +28 -0
  80. data/test/vendor/dhaka-2.2.1/test/chittagong/chittagong_driver.rb +46 -0
  81. data/test/vendor/dhaka-2.2.1/test/chittagong/chittagong_driver_test.rb +276 -0
  82. data/test/vendor/dhaka-2.2.1/test/chittagong/chittagong_evaluator.rb +284 -0
  83. data/test/vendor/dhaka-2.2.1/test/chittagong/chittagong_evaluator_test.rb +38 -0
  84. data/test/vendor/dhaka-2.2.1/test/chittagong/chittagong_grammar.rb +104 -0
  85. data/test/vendor/dhaka-2.2.1/test/chittagong/chittagong_lexer.rb +109 -0
  86. data/test/vendor/dhaka-2.2.1/test/chittagong/chittagong_lexer_specification.rb +37 -0
  87. data/test/vendor/dhaka-2.2.1/test/chittagong/chittagong_lexer_test.rb +58 -0
  88. data/test/vendor/dhaka-2.2.1/test/chittagong/chittagong_parser.rb +879 -0
  89. data/test/vendor/dhaka-2.2.1/test/chittagong/chittagong_parser_test.rb +55 -0
  90. data/test/vendor/dhaka-2.2.1/test/chittagong/chittagong_test.rb +170 -0
  91. data/test/vendor/dhaka-2.2.1/test/core/another_lalr_but_not_slr_grammar.rb +20 -0
  92. data/test/vendor/dhaka-2.2.1/test/core/compiled_parser_test.rb +44 -0
  93. data/test/vendor/dhaka-2.2.1/test/core/dfa_test.rb +170 -0
  94. data/test/vendor/dhaka-2.2.1/test/core/evaluator_test.rb +22 -0
  95. data/test/vendor/dhaka-2.2.1/test/core/grammar_test.rb +83 -0
  96. data/test/vendor/dhaka-2.2.1/test/core/lalr_but_not_slr_grammar.rb +19 -0
  97. data/test/vendor/dhaka-2.2.1/test/core/lexer_test.rb +139 -0
  98. data/test/vendor/dhaka-2.2.1/test/core/malformed_grammar.rb +7 -0
  99. data/test/vendor/dhaka-2.2.1/test/core/malformed_grammar_test.rb +8 -0
  100. data/test/vendor/dhaka-2.2.1/test/core/nullable_grammar.rb +21 -0
  101. data/test/vendor/dhaka-2.2.1/test/core/parse_result_test.rb +44 -0
  102. data/test/vendor/dhaka-2.2.1/test/core/parser_state_test.rb +24 -0
  103. data/test/vendor/dhaka-2.2.1/test/core/parser_test.rb +131 -0
  104. data/test/vendor/dhaka-2.2.1/test/core/precedence_grammar.rb +17 -0
  105. data/test/vendor/dhaka-2.2.1/test/core/precedence_grammar_test.rb +9 -0
  106. data/test/vendor/dhaka-2.2.1/test/core/rr_conflict_grammar.rb +21 -0
  107. data/test/vendor/dhaka-2.2.1/test/core/simple_grammar.rb +22 -0
  108. data/test/vendor/dhaka-2.2.1/test/core/sr_conflict_grammar.rb +16 -0
  109. data/test/vendor/dhaka-2.2.1/test/dhaka_test_helper.rb +17 -0
  110. data/test/vendor/dhaka-2.2.1/test/fake_logger.rb +17 -0
  111. data/test/vendor/simplerdb-0.2/lib/simplerdb/client_exception.rb +10 -0
  112. data/test/vendor/simplerdb-0.2/lib/simplerdb/db.rb +146 -0
  113. data/test/vendor/simplerdb-0.2/lib/simplerdb/query_language.rb +266 -0
  114. data/test/vendor/simplerdb-0.2/lib/simplerdb/server.rb +33 -0
  115. data/test/vendor/simplerdb-0.2/lib/simplerdb/servlet.rb +191 -0
  116. data/test/vendor/simplerdb-0.2/lib/simplerdb.rb +3 -0
  117. data/test/vendor/simplerdb-0.2/test/functional_test.rb +81 -0
  118. data/test/vendor/simplerdb-0.2/test/query_evaluator_test.rb +73 -0
  119. data/test/vendor/simplerdb-0.2/test/query_parser_test.rb +64 -0
  120. data/test/vendor/simplerdb-0.2/test/simplerdb_test.rb +80 -0
  121. metadata +182 -0
@@ -0,0 +1,55 @@
1
+ require File.dirname(__FILE__) + '/../dhaka_test_helper'
2
+ require File.dirname(__FILE__) + '/chittagong_grammar'
3
+ begin
4
+ require File.dirname(__FILE__) + "/chittagong_parser"
5
+ rescue LoadError
6
+ puts "Please run the rake command in the root folder to generate the lexer and parser required for this test."
7
+ exit
8
+ end
9
+
10
+ class TestChittagongParser < Test::Unit::TestCase
11
+
12
+ def test_parses_a_series_of_statements
13
+ token_stream = build_tokens(
14
+ 'newline',
15
+ 'word_literal', '=', 'numeric_literal', 'newline',
16
+ 'print', 'word_literal', 'newline',
17
+ 'newline',
18
+ 'word_literal', '=', 'word_literal', 'newline',
19
+ 'newline', Dhaka::END_SYMBOL_NAME
20
+ )
21
+
22
+ result = ChittagongParser.parse(token_stream)
23
+
24
+ assert_equal(["single_term",
25
+ "some_terms",
26
+ "variable_name",
27
+ "literal",
28
+ "assignment_statement",
29
+ "main_body_simple_statement",
30
+ "single_main_body_statement",
31
+ "single_term",
32
+ "variable_name",
33
+ "variable_reference",
34
+ "print_statement",
35
+ "main_body_simple_statement",
36
+ "multiple_main_body_statements",
37
+ "single_term",
38
+ "multiple_terms",
39
+ "variable_name",
40
+ "variable_name",
41
+ "variable_reference",
42
+ "assignment_statement",
43
+ "main_body_simple_statement",
44
+ "multiple_main_body_statements",
45
+ "single_term",
46
+ "multiple_terms",
47
+ "some_terms",
48
+ "program"], result.linearize.collect {|node| node.production.name})
49
+
50
+ end
51
+
52
+ def build_tokens *symbol_names
53
+ symbol_names.collect {|symbol_name| Dhaka::Token.new(symbol_name, nil, nil)}
54
+ end
55
+ end
@@ -0,0 +1,170 @@
1
+ require File.dirname(__FILE__) + '/../dhaka_test_helper'
2
+ require File.dirname(__FILE__) + "/chittagong_grammar"
3
+ require File.dirname(__FILE__) + "/chittagong_lexer_specification"
4
+ begin
5
+ require File.dirname(__FILE__) + "/chittagong_parser"
6
+ require File.dirname(__FILE__) + "/chittagong_lexer"
7
+ rescue LoadError
8
+ puts "Please run the rake command in the root folder to generate the lexer and parser required for this test."
9
+ exit
10
+ end
11
+ require File.dirname(__FILE__) + "/chittagong_evaluator"
12
+
13
+ class TestChittagong < Test::Unit::TestCase
14
+
15
+ def fact(n)
16
+ return 1 if n==1
17
+ n * fact(n-1)
18
+ end
19
+
20
+ def program_output program
21
+ output_stream = []
22
+ parse_result = ChittagongParser.parse(ChittagongLexer.lex(program))
23
+ result = ChittagongEvaluator.new([{}], output_stream).evaluate(parse_result)
24
+ return result, output_stream
25
+ end
26
+
27
+ def test_iterative_fibonacci_without_functions
28
+ program = "
29
+
30
+ n = 1
31
+ a = 0
32
+ b = 1
33
+ while n < 10
34
+ print b
35
+ c = a
36
+ a = b
37
+ b = c + b
38
+ n = n + 1
39
+ end
40
+
41
+ "
42
+
43
+ result, output_stream = program_output(program)
44
+ assert_equal(["1.0", "1.0", "2.0", "3.0", "5.0", "8.0", "13.0", "21.0", "34.0"], output_stream)
45
+ end
46
+
47
+ def test_iterative_fibonacci_with_functions
48
+ program = "
49
+
50
+ def fib(n)
51
+ i = 0
52
+ a = 0
53
+ b = 1
54
+ while i < n
55
+ c = a
56
+ a = b
57
+ b = c + b
58
+ i = i + 1
59
+ end
60
+ return b
61
+ end
62
+
63
+ x = 0
64
+ while x < 9
65
+ print fib(x)
66
+ x = x + 1
67
+ end
68
+
69
+ "
70
+ result, output_stream = program_output(program)
71
+ assert_equal(["1.0", "1.0", "2.0", "3.0", "5.0", "8.0", "13.0", "21.0", "34.0"], output_stream)
72
+ end
73
+
74
+ def test_recursive_factorial
75
+ program = "
76
+ def fact(n)
77
+ if n == 1
78
+ return 1
79
+ end
80
+ return n * fact(n-1)
81
+ end
82
+
83
+ n = 1
84
+ while n < 11
85
+ print fact(n)
86
+ n = n+1
87
+ end"
88
+
89
+ result, output_stream = program_output(program)
90
+ assert_equal((1..10).collect {|i| fact(i).to_f.to_s}, output_stream)
91
+ end
92
+
93
+ def test_various_things
94
+ program = "
95
+
96
+ a = 1
97
+ b = 2
98
+ c = 3
99
+
100
+ def foo(a, b, c)
101
+ print a
102
+ print b
103
+ print c
104
+ return c
105
+ print 999
106
+ end
107
+
108
+ foo(4, a, 6)
109
+
110
+ "
111
+
112
+ result, output_stream = program_output(program)
113
+ assert_equal(["4.0", "1.0", "6.0"], output_stream)
114
+ end
115
+
116
+ def test_if_else_block
117
+ program = "
118
+
119
+ def foo(a, b)
120
+ if a < b
121
+ print 1
122
+ else
123
+ print 2
124
+ end
125
+ end
126
+
127
+ foo(1, 2)
128
+ foo(2, 1)
129
+
130
+ "
131
+
132
+ result, output_stream = program_output(program)
133
+ assert_equal(["1.0", "2.0"], output_stream)
134
+ end
135
+
136
+ def test_no_arg_functions
137
+ program = "
138
+
139
+ def foo()
140
+ print 1
141
+ print 2
142
+ end
143
+ foo()
144
+
145
+ "
146
+
147
+ result, output_stream = program_output(program)
148
+ assert_equal(["1.0", "2.0"], output_stream)
149
+ end
150
+
151
+ def test_decimal_numbers
152
+ program = "
153
+ print 0.2347 * 23.34
154
+ a = 1.012
155
+ b = 345.44
156
+ c = 0.234
157
+ print (a^b)/c
158
+ def foo(a)
159
+ print a
160
+ end
161
+ foo(3.4)
162
+ "
163
+
164
+ result, output_stream = program_output(program)
165
+ assert_equal(["5.477898", "263.233029427781", "3.4"], output_stream)
166
+ end
167
+
168
+
169
+
170
+ end
@@ -0,0 +1,20 @@
1
+ require File.dirname(__FILE__)+'/../dhaka_test_helper'
2
+
3
+ class AnotherLALRButNotSLRGrammar < Dhaka::Grammar
4
+
5
+ for_symbol(Dhaka::START_SYMBOL_NAME) do
6
+ assignment %w| L = R |
7
+ rhs %w| R |
8
+ end
9
+
10
+ for_symbol('L') do
11
+ contents %w| * R |
12
+ identifier %w| id |
13
+ end
14
+
15
+ for_symbol('R') do
16
+ l_value %w| L |
17
+ end
18
+
19
+ end
20
+
@@ -0,0 +1,44 @@
1
+ require File.dirname(__FILE__) + '/../dhaka_test_helper'
2
+ require File.dirname(__FILE__) + "/simple_grammar"
3
+ eval(Dhaka::Parser.new(SimpleGrammar).compile_to_ruby_source_as(:SimpleParser))
4
+
5
+ class TestCompiledParser < Test::Unit::TestCase
6
+ def test_compiled_parser_generates_parse_tree_for_simple_grammar
7
+ parse_tree = SimpleParser.parse(build_tokens(%w| ( n - ( n - n ) ) - n # | +[Dhaka::END_SYMBOL_NAME]))
8
+ assert_equal \
9
+ ["literal",
10
+ "term",
11
+ "literal",
12
+ "term",
13
+ "literal",
14
+ "subtraction",
15
+ "parenthetized_expression",
16
+ "subtraction",
17
+ "parenthetized_expression",
18
+ "term",
19
+ "literal",
20
+ "subtraction",
21
+ "expression",
22
+ "start"], parse_tree.linearize.collect {|node| node.production.name}
23
+ end
24
+
25
+ def test_parse_result_has_error_result_if_only_end_token_passed
26
+ parse_result = SimpleParser.parse(build_tokens([Dhaka::END_SYMBOL_NAME]))
27
+ assert parse_result.has_error?
28
+ end
29
+
30
+ def test_parse_result_is_nil_if_no_end_token
31
+ parse_result = SimpleParser.parse(build_tokens(%w| n - n |))
32
+ assert_nil(parse_result)
33
+ end
34
+
35
+ def test_parser_returns_error_result_with_index_of_bad_token_if_parse_error
36
+ parse_result = SimpleParser.parse(build_tokens(['(', '-', ')', Dhaka::END_SYMBOL_NAME]))
37
+ assert parse_result.has_error?
38
+ assert_equal '-', parse_result.unexpected_token.symbol_name
39
+ end
40
+
41
+ def build_tokens(token_symbol_names)
42
+ token_symbol_names.collect {|symbol_name| Dhaka::Token.new(symbol_name, nil, nil)}
43
+ end
44
+ end
@@ -0,0 +1,170 @@
1
+ require File.dirname(__FILE__) + '/../dhaka_test_helper'
2
+
3
+ class TestDFA < Test::Unit::TestCase
4
+ def test_build_AST_from_parse_tree_and_compute_follow_first_and_last
5
+ root = Dhaka::LexerSupport::RegexParser.parse(Dhaka::LexerSupport::RegexTokenizer.tokenize("(a|b)*abb"))
6
+ star_node = root.left.left.left.left
7
+ or_node = star_node.child
8
+ first_a = or_node.children[0]
9
+ first_b = or_node.children[1]
10
+ second_a = root.left.left.left.right
11
+ second_b = root.left.left.right
12
+ last_b = root.left.right
13
+ sentinel = root.right
14
+
15
+ assert(!root.nullable)
16
+ assert(!root.left.nullable)
17
+ assert(!root.left.left.nullable)
18
+ assert(star_node.nullable)
19
+
20
+ assert_equal(Set.new([first_a, first_b, second_a]), root.first)
21
+ assert_equal(Set.new([last_b]), root.left.last)
22
+
23
+ root.calculate_follow_sets
24
+
25
+ assert_equal(Set.new([first_a, first_b, second_a]), first_a.follow_set)
26
+ assert_equal(Set.new([first_a, first_b, second_a]), first_b.follow_set)
27
+ assert_equal(Set.new([second_b]), second_a.follow_set)
28
+ assert_equal(Set.new([last_b]), second_b.follow_set)
29
+ assert_equal(Set.new([sentinel]), last_b.follow_set)
30
+ end
31
+
32
+ def test_DFA_raises_exception_if_empty_regex
33
+ machine = Dhaka::LexerSupport::DFA.new("")
34
+ flunk "Should have thrown an unexpected end of regex exception"
35
+ rescue Dhaka::LexerSupport::InvalidRegexException => e
36
+ assert_equal("Unexpected end of regex.", e.message)
37
+ end
38
+
39
+ def test_DFA_raises_exception_if_error_parsing_regex
40
+ machine = Dhaka::LexerSupport::DFA.new("(a|b)*+abb")
41
+ flunk "Should have thrown an unexpected token exception"
42
+ rescue Dhaka::LexerSupport::InvalidRegexException => e
43
+ assert_equal("Unexpected token +: (a|b)*>>>+abb", e.message)
44
+ end
45
+
46
+ def test_match_a_regex
47
+ machine = Dhaka::LexerSupport::DFA.new("(a|b)*abb")
48
+ assert_full_match(machine, "abababb")
49
+ assert_full_match(machine, "ababaabb")
50
+ assert_empty(machine.match("abababab"))
51
+ assert_equal("abababb", machine.match("abababbc"))
52
+ assert_equal("abababb", machine.match("abababbaa"))
53
+ end
54
+
55
+ def test_match_a_regex_with_optional_characters_at_the_end
56
+ machine = Dhaka::LexerSupport::DFA.new("bad(c|d)+(ab)*")
57
+ assert_full_match(machine, "badccddabab")
58
+ assert_full_match(machine, "baddcc")
59
+ assert_empty(machine.match("badab"))
60
+ assert_empty(machine.match("bacdab"))
61
+ end
62
+
63
+ def test_match_a_nullable_regex
64
+ machine = Dhaka::LexerSupport::DFA.new("(ab)*")
65
+ assert_full_match(machine, "abab")
66
+ assert_full_match(machine, "ab")
67
+ assert_full_match(machine, "")
68
+ assert_equal("", machine.match("b"))
69
+ end
70
+
71
+ def test_match_a_regex_with_the_dot_character
72
+ machine = Dhaka::LexerSupport::DFA.new("ab.*cd")
73
+ assert_full_match(machine, "abacd")
74
+ assert_full_match(machine, "abcd")
75
+ assert_full_match(machine, "abAcd")
76
+ assert_empty(machine.match("ab999c"))
77
+ end
78
+
79
+ def test_match_a_regex_with_sets
80
+ machine = Dhaka::LexerSupport::DFA.new("ab[j-lu]*cd")
81
+ assert_empty(machine.match("abacd"))
82
+ assert_full_match(machine, "abcd")
83
+ assert_full_match(machine, "abjklucd")
84
+ assert_empty(machine.match("abijklucd"))
85
+ assert_empty(machine.match("ab999c"))
86
+ end
87
+
88
+ def test_match_a_regex_with_negative_sets
89
+ machine = Dhaka::LexerSupport::DFA.new("ab[^j-lr]*cd")
90
+ assert_full_match(machine, "abcd")
91
+ assert_empty(machine.match("abjcd"))
92
+ assert_empty(machine.match("abrcd"))
93
+ assert_empty(machine.match("abijklucd"))
94
+ assert_full_match(machine, "abyqcd")
95
+ end
96
+
97
+ def test_match_a_regex_with_sets_containing_escaped_characters
98
+ machine = Dhaka::LexerSupport::DFA.new("ab[\\^\\-.]*cd")
99
+ assert_full_match(machine, "abcd")
100
+ assert_empty(machine.match("abjcd"))
101
+ assert_full_match(machine, "ab^-.cd")
102
+ assert_empty(machine.match("abijklucd"))
103
+ assert_empty(machine.match("ab\\cd"))
104
+ end
105
+
106
+ def test_match_a_regex_using_unescaped_caret_and_dash_characters
107
+ machine = Dhaka::LexerSupport::DFA.new("(\\^-)+")
108
+ assert_full_match(machine, "^-")
109
+ assert_full_match(machine, "^-^-")
110
+ assert_empty(machine.match("?cd"))
111
+ end
112
+
113
+ def test_match_a_regex_using_escape_characters
114
+ machine = Dhaka::LexerSupport::DFA.new(%q/(-\?\(\)\\\\)*/)
115
+ assert_full_match(machine, "-?()\\")
116
+ end
117
+
118
+ def test_match_a_regex_using_lt_and_gt
119
+ machine = Dhaka::LexerSupport::DFA.new('<.+>')
120
+ assert_full_match(machine, "<ab>")
121
+ assert_full_match(machine, "<absdf><sdg><sse>")
122
+ assert_empty(machine.match("ab>"))
123
+ end
124
+
125
+ def test_simulating_curly_brace_quantifiers
126
+ machine = Dhaka::LexerSupport::DFA.new('aaa?a?a?')
127
+ assert_full_match(machine, "aa")
128
+ assert_full_match(machine, "aaa")
129
+ assert_full_match(machine, "aaaa")
130
+ assert_full_match(machine, "aaaaa")
131
+ assert_equal("aaaaa", machine.match("aaaaaa"))
132
+ assert_empty(machine.match("a"))
133
+ end
134
+
135
+ def test_matching_a_regex_with_lookahead
136
+ machine = Dhaka::LexerSupport::DFA.new('ab/cd')
137
+ assert_equal("ab", machine.match("abcd"))
138
+ assert_empty(machine.match("ab"))
139
+ assert_empty(machine.match("abef"))
140
+ end
141
+
142
+ def test_matching_a_regex_with_nullable_pre_lookahead_regex
143
+ machine = Dhaka::LexerSupport::DFA.new('(ab)*/cd')
144
+ assert_equal("ab", machine.match("abcd"))
145
+ assert_equal("ababab", machine.match("abababcd"))
146
+ assert_empty(machine.match("ababc"))
147
+ assert_empty(machine.match("abef"))
148
+ end
149
+
150
+ def test_matching_a_regex_with_post_lookahead_characters_in_common_with_pre_lookahead_characters
151
+ machine = Dhaka::LexerSupport::DFA.new('(ab)+/abcd')
152
+ assert_equal("ababab", machine.match("abababcd"))
153
+ assert_empty(machine.match("ab"))
154
+ assert_empty(machine.match("abef"))
155
+ end
156
+
157
+ def test_machine_with_nullable_lookahead
158
+ machine = Dhaka::LexerSupport::DFA.new(":/[aA\n\r\t]*")
159
+ assert_equal(":", machine.match(":"))
160
+ end
161
+
162
+ private
163
+ def assert_full_match(machine, input)
164
+ assert_equal(input, machine.match(input))
165
+ end
166
+
167
+ def assert_empty(input)
168
+ assert(input.empty?)
169
+ end
170
+ end
@@ -0,0 +1,22 @@
1
+ require File.dirname(__FILE__) + '/../dhaka_test_helper'
2
+ require File.dirname(__FILE__) + '/simple_grammar'
3
+
4
+ class TestEvaluator < Test::Unit::TestCase
5
+ def test_throws_exception_if_evaluation_rules_not_completely_defined_and_raise_error_option_set_to_true
6
+ assert_raise(Dhaka::EvaluatorDefinitionError) do
7
+ eval(
8
+ "class IncompleteSimpleEvaluator < Dhaka::Evaluator
9
+ self.grammar = SimpleGrammar
10
+ define_evaluation_rules(:raise_error => true) do
11
+ for_start do
12
+ something
13
+ end
14
+
15
+ for_literal do
16
+ something
17
+ end
18
+ end
19
+ end")
20
+ end
21
+ end
22
+ end
@@ -0,0 +1,83 @@
1
+ require File.dirname(__FILE__) + '/../dhaka_test_helper'
2
+ require File.dirname(__FILE__) + '/simple_grammar'
3
+
4
+ class SimpleGrammarTest < Test::Unit::TestCase
5
+ def setup
6
+ @grammar = SimpleGrammar
7
+ end
8
+
9
+ def test_loads_symbols_and_classifies_them
10
+ expected_non_terminals = Set.new(['E', 'S', 'T', Dhaka::START_SYMBOL_NAME])
11
+ expected_terminals = Set.new(['-', 'n', '(', ')', '#', Dhaka::END_SYMBOL_NAME])
12
+ assert_equal(expected_non_terminals, Set.new(@grammar.non_terminal_symbols.collect {|symbol| symbol.name}))
13
+ assert_equal(expected_terminals, Set.new(@grammar.terminal_symbols.collect {|symbol| symbol.name}))
14
+ end
15
+
16
+ def test_creates_productions
17
+ productions_for_E = @grammar.productions_for_symbol(@grammar.symbol_for_name('E'))
18
+ assert(productions_for_E.size == 2)
19
+ expected_productions_for_E = Set.new(['subtraction E ::= E - T', 'term E ::= T'])
20
+ assert_equal(expected_productions_for_E, Set.new(productions_for_E.collect {|production| production.to_s}))
21
+ productions_for_start = @grammar.productions_for_symbol(@grammar.start_symbol)
22
+ assert(productions_for_start.size == 1)
23
+ expected_productions_for_start = Set.new(['start _Start_ ::= S #'])
24
+ assert_equal(expected_productions_for_start, Set.new(productions_for_start.collect {|production| production.to_s}))
25
+ end
26
+
27
+ def test_symbols_in_productions_use_the_flyweight_pattern
28
+ assert_same(@grammar.production_named('subtraction').symbol, @grammar.production_named('term').symbol)
29
+ assert_same(@grammar.production_named('expression').expansion.first, @grammar.production_named('subtraction').expansion.first)
30
+ end
31
+
32
+ def test_first_with_non_terminal
33
+ expected_symbols = Set.new(['(', 'n'])
34
+ assert_equal(expected_symbols, Set.new(@grammar.first(@grammar.symbol_for_name('E')).collect {|symbol| symbol.name}))
35
+ end
36
+
37
+ def test_first_with_terminal
38
+ expected_symbols = Set.new(['('])
39
+ assert_equal(expected_symbols, Set.new(@grammar.first(@grammar.symbol_for_name('(')).collect {|symbol| symbol.name}))
40
+ end
41
+
42
+ def test_computes_closures_and_channels_given_a_kernel
43
+ start_production = @grammar.production_named('start')
44
+ start_item = Dhaka::Item.new(start_production, 0)
45
+ kernel = Set.new([start_item])
46
+ closure, channels = @grammar.closure(kernel)
47
+ expected_items = Set.new(['_Start_ ::= -> S # []',
48
+ 'S ::= -> E []',
49
+ 'E ::= -> E - T []',
50
+ 'E ::= -> T []',
51
+ 'T ::= -> n []',
52
+ 'T ::= -> ( E ) []'])
53
+ expected_channels = Set.new([
54
+ 'Spontaneous Channel from E ::= -> E - T [] to E ::= -> E - T []',
55
+ 'Spontaneous Channel from S ::= -> E [] to E ::= -> T []',
56
+ 'Spontaneous Channel from E ::= -> T [] to T ::= -> n []',
57
+ 'Spontaneous Channel from S ::= -> E [] to E ::= -> E - T []',
58
+ 'Spontaneous Channel from E ::= -> T [] to T ::= -> ( E ) []',
59
+ 'Spontaneous Channel from E ::= -> E - T [] to E ::= -> T []',
60
+ 'Spontaneous Channel from _Start_ ::= -> S # [] to S ::= -> E []'
61
+ ])
62
+ assert_equal(expected_items, Set.new(closure.values.collect{|item| item.to_s}))
63
+ assert_equal(expected_channels, Set.new(channels.values.collect{|set| set.to_a}.flatten.collect{|item| item.to_s}))
64
+ end
65
+
66
+ def test_export_grammar_to_bnf
67
+ assert_equal(
68
+ '
69
+ "_Start_" :
70
+ | "S" "#"
71
+
72
+ "S" :
73
+ | "E"
74
+
75
+ "E" :
76
+ | "E" "-" "T"
77
+ | "T"
78
+
79
+ "T" :
80
+ | "n"
81
+ | "(" "E" ")"', @grammar.to_bnf)
82
+ end
83
+ end
@@ -0,0 +1,19 @@
1
+ class LALRButNotSLRGrammar < Dhaka::Grammar
2
+
3
+ for_symbol(Dhaka::START_SYMBOL_NAME) do
4
+ start %w| E |
5
+ end
6
+
7
+ for_symbol('E') do
8
+ E_Aa %w| A a |
9
+ E_bAc %w| b A c |
10
+ E_dc %w| d c |
11
+ E_bda %w| b d a |
12
+ end
13
+
14
+ for_symbol('A') do
15
+ A_d %w| d |
16
+ end
17
+
18
+ end
19
+