hammer-parser 0.2.1

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,132 @@
1
+ # -*- coding: utf-8 -*-
2
+ require 'bundler/setup'
3
+ require 'hammer-parser'
4
+ require 'minitest/autorun'
5
+
6
+ class ParserTest < Minitest::Test
7
+ def test_builder_1
8
+ parser = Hammer::Parser.build {
9
+ token 'blah'
10
+ ch 'a'.ord
11
+ choice {
12
+ sequence {
13
+ token 'abc'
14
+ }
15
+ token 'def'
16
+ }
17
+ }
18
+
19
+ refute_nil parser
20
+
21
+ refute_nil parser.parse('blahaabcd')
22
+ refute_nil parser.parse('blahadefd')
23
+ assert_nil parser.parse('blahablad')
24
+ assert_nil parser.parse('blaha')
25
+ assert_nil parser.parse('blah')
26
+ end
27
+
28
+ def test_builder_2
29
+ parser = Hammer::ParserBuilder.new
30
+ .token('Hello ')
31
+ .choice(Hammer::Parser.token('Mom'), Hammer::Parser.token('Dad'))
32
+ .token('!')
33
+ .build
34
+
35
+ refute_nil parser
36
+ refute_nil parser.parse('Hello Mom!')
37
+ end
38
+
39
+ def test_builder_3
40
+ h = Hammer::Parser
41
+ parser = h.sequence(h.token('Hello '), h.choice(h.token('Mom'), h.token('Dad')), h.token('!'))
42
+
43
+ refute_nil parser
44
+ refute_nil parser.parse('Hello Mom!')
45
+ end
46
+
47
+ def test_string_copied
48
+ s = 'blah'
49
+ parser = Hammer::Parser.token(s)
50
+
51
+ refute_equal s, 'BLAH'
52
+ assert_nil parser.parse('BLAH')
53
+
54
+ # parser still shouldn't match, even if we modify the string in-place
55
+ s.upcase!
56
+ assert_equal s, 'BLAH'
57
+ assert_nil parser.parse('BLAH')
58
+ end
59
+
60
+ def test_indirect
61
+ x = nil
62
+ parser = Hammer::Parser.build {
63
+ token 'abc'
64
+ x = indirect
65
+ end_p
66
+ }
67
+ x.bind(Hammer::Parser.token('abd'))
68
+
69
+ assert_nil parser.parse('abcabdabd')
70
+ refute_nil parser.parse('abcabd')
71
+ assert_nil parser.parse('abdabd')
72
+ assert_nil parser.parse('abc')
73
+ end
74
+
75
+ def test_multibyte_token
76
+ parser = Hammer::Parser.build {
77
+ token '今日'
78
+ token 'a'
79
+ end_p
80
+ }
81
+
82
+ refute_nil parser.parse('今日a')
83
+ end
84
+
85
+ def test_token_encoding(encoding='UTF-8')
86
+ string = '今日'.encode(encoding)
87
+ parser = Hammer::Parser.token(string)
88
+ assert_equal string, parser.parse(string).ast.unmarshal
89
+ end
90
+
91
+ def test_token_encoding_2
92
+ test_token_encoding('EUC-JP')
93
+ end
94
+ end
95
+
96
+ class AttrBoolTest < Minitest::Test
97
+ def setup
98
+ h = Hammer::Parser
99
+ @parser = h.attr_bool(h.many1(h.choice(h.ch('a'), h.ch('b')))) {|x|
100
+ data = x.unmarshal
101
+ data.length > 1 && data[0] == data[1]
102
+ }
103
+ end
104
+
105
+ def test_1
106
+ assert_parse_ok @parser, "aa", ['a','a']
107
+ end
108
+ def test_2
109
+ assert_parse_ok @parser, "bb", ['b','b']
110
+ end
111
+ def test_3
112
+ refute_parse_ok @parser, "ab"
113
+ end
114
+ end
115
+
116
+ class ActionTest < Minitest::Test
117
+ def setup
118
+ h = Hammer::Parser
119
+ @parser = h.action(h.sequence(h.choice(h.ch('a'), h.ch('A')),
120
+ h.choice(h.ch('b'), h.ch('B')))) {|x|
121
+ x.unmarshal.join(",")}
122
+ end
123
+ def test_1
124
+ assert_parse_ok @parser, "ab", "a,b"
125
+ end
126
+ def test_2
127
+ assert_parse_ok @parser, "AB", "A,B"
128
+ end
129
+ def test_3
130
+ refute_parse_ok @parser, "XX"
131
+ end
132
+ end
metadata ADDED
@@ -0,0 +1,83 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: hammer-parser
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.2.1
5
+ platform: ruby
6
+ authors:
7
+ - Meredith L. Patterson
8
+ - TQ Hirsch
9
+ - Jakob Rath
10
+ autorequire:
11
+ bindir: bin
12
+ cert_chain: []
13
+ date: 2016-11-06 00:00:00.000000000 Z
14
+ dependencies:
15
+ - !ruby/object:Gem::Dependency
16
+ name: ffi
17
+ requirement: !ruby/object:Gem::Requirement
18
+ requirements:
19
+ - - "~>"
20
+ - !ruby/object:Gem::Version
21
+ version: '1.9'
22
+ type: :runtime
23
+ prerelease: false
24
+ version_requirements: !ruby/object:Gem::Requirement
25
+ requirements:
26
+ - - "~>"
27
+ - !ruby/object:Gem::Version
28
+ version: '1.9'
29
+ - !ruby/object:Gem::Dependency
30
+ name: docile
31
+ requirement: !ruby/object:Gem::Requirement
32
+ requirements:
33
+ - - "~>"
34
+ - !ruby/object:Gem::Version
35
+ version: '1.1'
36
+ type: :runtime
37
+ prerelease: false
38
+ version_requirements: !ruby/object:Gem::Requirement
39
+ requirements:
40
+ - - "~>"
41
+ - !ruby/object:Gem::Version
42
+ version: '1.1'
43
+ description: Ruby bindings to the hammer parsing library.
44
+ email: hammer@upstandinghackers.com
45
+ executables: []
46
+ extensions: []
47
+ extra_rdoc_files: []
48
+ files:
49
+ - README.md
50
+ - lib/hammer-parser.rb
51
+ - lib/hammer/internal.rb
52
+ - lib/hammer/parser.rb
53
+ - lib/hammer/parser_builder.rb
54
+ - lib/minitest/hamer-parser_plugin.rb
55
+ - test/autogen_test.rb
56
+ - test/parser_test.rb
57
+ homepage: https://github.com/UpstandingHackers/hammer
58
+ licenses:
59
+ - GPL-2.0
60
+ metadata: {}
61
+ post_install_message:
62
+ rdoc_options: []
63
+ require_paths:
64
+ - lib
65
+ required_ruby_version: !ruby/object:Gem::Requirement
66
+ requirements:
67
+ - - ">="
68
+ - !ruby/object:Gem::Version
69
+ version: '0'
70
+ required_rubygems_version: !ruby/object:Gem::Requirement
71
+ requirements:
72
+ - - ">="
73
+ - !ruby/object:Gem::Version
74
+ version: '0'
75
+ requirements: []
76
+ rubyforge_project:
77
+ rubygems_version: 2.5.1
78
+ signing_key:
79
+ specification_version: 4
80
+ summary: Ruby bindings to the hammer parsing library.
81
+ test_files:
82
+ - test/autogen_test.rb
83
+ - test/parser_test.rb