hammer-parser 0.2.1

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.
@@ -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