myco 0.1.8 → 0.1.9

Sign up to get free protection for your applications and to get access to all the features.
Files changed (89) hide show
  1. checksums.yaml +4 -4
  2. data/lib/myco/bootstrap/instance.rb +13 -3
  3. data/lib/myco/code_tools/AST.my +0 -2
  4. data/lib/myco/code_tools/AST.my.rb +0 -1
  5. data/lib/myco/code_tools/AST/Block.my +15 -4
  6. data/lib/myco/code_tools/AST/Block.my.rb +16 -3
  7. data/lib/myco/code_tools/AST/DeclareMeme.my +44 -64
  8. data/lib/myco/code_tools/AST/DeclareMeme.my.rb +66 -74
  9. data/lib/myco/code_tools/AST/ToRuby.my +17 -20
  10. data/lib/myco/code_tools/AST/ToRuby.my.rb +24 -22
  11. data/lib/myco/code_tools/Parser.my +2 -1
  12. data/lib/myco/code_tools/Parser.my.rb +2 -1
  13. data/lib/myco/code_tools/parser/MycoBuilder.my +2 -2
  14. data/lib/myco/code_tools/parser/MycoBuilder.my.rb +2 -2
  15. data/lib/myco/code_tools/parser/MycoGrammar.my +28 -21
  16. data/lib/myco/code_tools/parser/MycoGrammar.my.rb +94 -56
  17. data/lib/myco/code_tools/parser/pegleromyces/lib/pegleromyces.my +10 -11
  18. data/lib/myco/code_tools/parser/pegleromyces/lib/pegleromyces.my.rb +10 -9
  19. data/lib/myco/code_tools/parser/pegleromyces/lib/pegleromyces/BytecodeHelpers.my +25 -3
  20. data/lib/myco/code_tools/parser/pegleromyces/lib/pegleromyces/BytecodeHelpers.my.rb +38 -0
  21. data/lib/myco/code_tools/parser/pegleromyces/lib/pegleromyces/Capture.my +152 -0
  22. data/lib/myco/code_tools/parser/pegleromyces/lib/pegleromyces/Capture.my.rb +189 -0
  23. data/lib/myco/code_tools/parser/pegleromyces/lib/pegleromyces/Common.my +84 -0
  24. data/lib/myco/code_tools/parser/pegleromyces/lib/pegleromyces/Common.my.rb +114 -0
  25. data/lib/myco/code_tools/parser/pegleromyces/lib/pegleromyces/Common/Parser.my +139 -0
  26. data/lib/myco/code_tools/parser/pegleromyces/lib/pegleromyces/{BytecodeParser.my.rb → Common/Parser.my.rb} +17 -36
  27. data/lib/myco/code_tools/parser/pegleromyces/lib/pegleromyces/Composite.my +229 -0
  28. data/lib/myco/code_tools/parser/pegleromyces/lib/pegleromyces/Composite.my.rb +296 -0
  29. data/lib/myco/code_tools/parser/pegleromyces/lib/pegleromyces/Grammar.my +8 -25
  30. data/lib/myco/code_tools/parser/pegleromyces/lib/pegleromyces/Grammar.my.rb +9 -37
  31. data/lib/myco/code_tools/parser/pegleromyces/lib/pegleromyces/Parser.my +139 -37
  32. data/lib/myco/code_tools/parser/pegleromyces/lib/pegleromyces/Parser.my.rb +206 -36
  33. data/lib/myco/code_tools/parser/pegleromyces/lib/pegleromyces/Processor.my +21 -12
  34. data/lib/myco/code_tools/parser/pegleromyces/lib/pegleromyces/Processor.my.rb +45 -24
  35. data/lib/myco/code_tools/parser/pegleromyces/lib/pegleromyces/Stream.my +99 -0
  36. data/lib/myco/code_tools/parser/pegleromyces/lib/pegleromyces/Stream.my.rb +152 -0
  37. data/lib/myco/code_tools/parser/pegleromyces/lib/pegleromyces/Stream/Parser.my +37 -0
  38. data/lib/myco/code_tools/parser/pegleromyces/lib/pegleromyces/Stream/Parser.my.rb +57 -0
  39. data/lib/myco/code_tools/parser/pegleromyces/lib/pegleromyces/String.my +136 -0
  40. data/lib/myco/code_tools/parser/pegleromyces/lib/pegleromyces/String.my.rb +147 -0
  41. data/lib/myco/code_tools/parser/pegleromyces/lib/pegleromyces/String/Parser.my +45 -0
  42. data/lib/myco/code_tools/parser/pegleromyces/lib/pegleromyces/String/Parser.my.rb +85 -0
  43. data/lib/myco/code_tools/parser/pegleromyces/spec/Patterns.test.my +31 -25
  44. data/lib/myco/code_tools/parser/pegleromyces/spec/Patterns.test.my.rb +44 -25
  45. data/lib/myco/code_tools/parser/pegleromyces/spec/Stream/Parser.test.my +49 -0
  46. data/lib/myco/code_tools/parser/pegleromyces/spec/Stream/Parser.test.my.rb +119 -0
  47. data/lib/myco/code_tools/parser/pegleromyces/spec/Stream/Patterns.test.my +131 -0
  48. data/lib/myco/code_tools/parser/pegleromyces/spec/Stream/Patterns.test.my.rb +595 -0
  49. data/lib/myco/code_tools/parser/pegleromyces/spec/{BytecodeParser.test.my → String/Parser.test.my} +41 -2
  50. data/lib/myco/code_tools/parser/pegleromyces/spec/{BytecodeParser.test.my.rb → String/Parser.test.my.rb} +144 -3
  51. data/lib/myco/code_tools/parser/pegleromyces/spec/run.my +4 -10
  52. data/lib/myco/code_tools/parser/pegleromyces/spec/run.my.rb +4 -8
  53. data/lib/myco/core.my +1 -0
  54. data/lib/myco/core.my.rb +1 -0
  55. data/lib/myco/core/BasicObject.my +4 -2
  56. data/lib/myco/core/BasicObject.my.rb +2 -5
  57. data/lib/myco/core/Loop.my +5 -0
  58. data/lib/myco/core/Loop.my.rb +13 -0
  59. data/lib/myco/dev.rb +1 -0
  60. data/lib/myco/dev/profile.rb +12 -0
  61. data/lib/myco/version.rb +3 -3
  62. metadata +54 -59
  63. data/lib/myco/code_tools/AST/DeclareDecorator.my +0 -19
  64. data/lib/myco/code_tools/AST/DeclareDecorator.my.rb +0 -24
  65. data/lib/myco/code_tools/parser/pegleromyces/lib/pegleromyces/Builder.my +0 -4
  66. data/lib/myco/code_tools/parser/pegleromyces/lib/pegleromyces/Builder.my.rb +0 -5
  67. data/lib/myco/code_tools/parser/pegleromyces/lib/pegleromyces/BytecodeInstructions.my +0 -420
  68. data/lib/myco/code_tools/parser/pegleromyces/lib/pegleromyces/BytecodeInstructions.my.rb +0 -415
  69. data/lib/myco/code_tools/parser/pegleromyces/lib/pegleromyces/BytecodeParser.my +0 -147
  70. data/lib/myco/code_tools/parser/pegleromyces/lib/pegleromyces/Constructions.my +0 -183
  71. data/lib/myco/code_tools/parser/pegleromyces/lib/pegleromyces/Constructions.my.rb +0 -370
  72. data/lib/myco/code_tools/parser/pegleromyces/lib/pegleromyces/Instructions.my +0 -139
  73. data/lib/myco/code_tools/parser/pegleromyces/lib/pegleromyces/Instructions.my.rb +0 -284
  74. data/lib/myco/code_tools/parser/pegleromyces/lib/pegleromyces/Machine.my +0 -37
  75. data/lib/myco/code_tools/parser/pegleromyces/lib/pegleromyces/Machine.my.rb +0 -24
  76. data/lib/myco/code_tools/parser/pegleromyces/lib/pegleromyces/Patterns.my +0 -123
  77. data/lib/myco/code_tools/parser/pegleromyces/lib/pegleromyces/Patterns.my.rb +0 -164
  78. data/lib/myco/code_tools/parser/pegleromyces/spec/Builder.test.my +0 -10
  79. data/lib/myco/code_tools/parser/pegleromyces/spec/Builder.test.my.rb +0 -9
  80. data/lib/myco/code_tools/parser/pegleromyces/spec/BytecodeInstructions.test.my +0 -10
  81. data/lib/myco/code_tools/parser/pegleromyces/spec/BytecodeInstructions.test.my.rb +0 -9
  82. data/lib/myco/code_tools/parser/pegleromyces/spec/Constructions.test.my +0 -229
  83. data/lib/myco/code_tools/parser/pegleromyces/spec/Constructions.test.my.rb +0 -663
  84. data/lib/myco/code_tools/parser/pegleromyces/spec/Instructions.test.my +0 -10
  85. data/lib/myco/code_tools/parser/pegleromyces/spec/Instructions.test.my.rb +0 -9
  86. data/lib/myco/code_tools/parser/pegleromyces/spec/Machine.test.my +0 -13
  87. data/lib/myco/code_tools/parser/pegleromyces/spec/Machine.test.my.rb +0 -20
  88. data/lib/myco/code_tools/parser/pegleromyces/spec/Parser.test.my +0 -54
  89. data/lib/myco/code_tools/parser/pegleromyces/spec/Parser.test.my.rb +0 -215
@@ -0,0 +1,49 @@
1
+
2
+ BasicSpec {
3
+ name: "Stream::Parser"
4
+
5
+ new_parser: Stream::Parser.new
6
+
7
+ [tests]
8
+
9
+ it "can match from a minimal grammar": {
10
+ parser = new_parser
11
+ parser.grammar = Grammar {
12
+ [rules]
13
+ rule root: si.+
14
+ }
15
+ state = parser.parse([:x, :y, :z])
16
+ assert_equal(state.end_idx, 3)
17
+ }
18
+
19
+ it "can match from a minimal grammar with rules in the stream items": {
20
+ parser = new_parser
21
+ parser.grammar = Grammar {
22
+ [rules]
23
+ rule root: si([:to_sym, [], :x]).+
24
+ }
25
+ state = parser.parse([:x, :x, :x])
26
+ assert_equal(state.end_idx, 3)
27
+ }
28
+
29
+ it "can create a result from reductions": {
30
+ parser = new_parser
31
+ parser.grammar = Grammar {
32
+ [rules]
33
+ rule root: r(si.+[:list]) { list.join('.') }[:root]
34
+ }
35
+ state = parser.parse([:x, :y, :z])
36
+ assert_equal(state.result[:root], 'x.y.z')
37
+ }
38
+
39
+ it "captures individual items for single-item captures": {
40
+ parser = new_parser
41
+ parser.grammar = Grammar {
42
+ [rules]
43
+ rule root: r(si[:a] + si[:b] + si.+[:rest]) { [a, b, rest] }[:root]
44
+ }
45
+ state = parser.parse([:x, :y, :z])
46
+ assert_equal(state.result[:root], [:x, :y, [:z]])
47
+ }
48
+
49
+ }
@@ -0,0 +1,119 @@
1
+
2
+ ::Myco::Component.new([::Myco::FileToplevel], ::Myco.cscope.for_method_definition, __FILE__, __LINE__)
3
+ .tap { |__c__| __c__.__last__ = __c__.component_eval {(::Myco::Component.new([::Myco.find_constant(:BasicSpec)], ::Myco.cscope.for_method_definition, __FILE__, __LINE__)
4
+ .tap { |__c__| __c__.__last__ = __c__.component_eval {(
5
+ declare_meme(:name, [], nil, ::Myco.cscope.dup) { |*| ("Stream::Parser")}
6
+ declare_meme(:new_parser, [], nil, ::Myco.cscope.dup) { |*| (::Myco.find_constant(:Stream)::Parser.new)}
7
+ __category__(:tests).component_eval {(
8
+ declare_meme(:"can match from a minimal grammar", [[:it, []]], nil, ::Myco.cscope.dup) { |*| (
9
+ parser = self.new_parser
10
+ parser.__send__(
11
+ :grammar=,
12
+ ::Myco::Component.new([::Myco.find_constant(:Grammar)], ::Myco.cscope.for_method_definition, __FILE__, __LINE__)
13
+ .tap { |__c__| __c__.__last__ = __c__.component_eval {(__category__(:rules).component_eval {(declare_meme(:root, [[:rule, []]], nil, ::Myco.cscope.dup) { |*| (self.si.__send__(:+))})})}}.instance
14
+ )
15
+ state = parser.parse([
16
+ :x,
17
+ :y,
18
+ :z
19
+ ])
20
+ self.assert_equal(
21
+ state.end_idx,
22
+ 3
23
+ )
24
+ )}
25
+ declare_meme(:"can match from a minimal grammar with rules in the stream items", [[:it, []]], nil, ::Myco.cscope.dup) { |*| (
26
+ parser = self.new_parser
27
+ parser.__send__(
28
+ :grammar=,
29
+ ::Myco::Component.new([::Myco.find_constant(:Grammar)], ::Myco.cscope.for_method_definition, __FILE__, __LINE__)
30
+ .tap { |__c__| __c__.__last__ = __c__.component_eval {(__category__(:rules).component_eval {(declare_meme(:root, [[:rule, []]], nil, ::Myco.cscope.dup) { |*| (self.si([
31
+ :to_sym,
32
+ [],
33
+ :x
34
+ ]).__send__(:+))})})}}.instance
35
+ )
36
+ state = parser.parse([
37
+ :x,
38
+ :x,
39
+ :x
40
+ ])
41
+ self.assert_equal(
42
+ state.end_idx,
43
+ 3
44
+ )
45
+ )}
46
+ declare_meme(:"can create a result from reductions", [[:it, []]], nil, ::Myco.cscope.dup) { |*| (
47
+ parser = self.new_parser
48
+ parser.__send__(
49
+ :grammar=,
50
+ ::Myco::Component.new([::Myco.find_constant(:Grammar)], ::Myco.cscope.for_method_definition, __FILE__, __LINE__)
51
+ .tap { |__c__| __c__.__last__ = __c__.component_eval {(__category__(:rules).component_eval {(declare_meme(:root, [[:rule, []]], nil, ::Myco.cscope.dup) { |*| (self.r(self.si.__send__(:+).__send__(
52
+ :[],
53
+ :list
54
+ )) { || (self.list.join("."))}.__send__(
55
+ :[],
56
+ :root
57
+ ))})})}}.instance
58
+ )
59
+ state = parser.parse([
60
+ :x,
61
+ :y,
62
+ :z
63
+ ])
64
+ self.assert_equal(
65
+ state.result.__send__(
66
+ :[],
67
+ :root
68
+ ),
69
+ "x.y.z"
70
+ )
71
+ )}
72
+ declare_meme(:"captures individual items for single-item captures", [[:it, []]], nil, ::Myco.cscope.dup) { |*| (
73
+ parser = self.new_parser
74
+ parser.__send__(
75
+ :grammar=,
76
+ ::Myco::Component.new([::Myco.find_constant(:Grammar)], ::Myco.cscope.for_method_definition, __FILE__, __LINE__)
77
+ .tap { |__c__| __c__.__last__ = __c__.component_eval {(__category__(:rules).component_eval {(declare_meme(:root, [[:rule, []]], nil, ::Myco.cscope.dup) { |*| (self.r(self.si.__send__(
78
+ :[],
79
+ :a
80
+ ).__send__(
81
+ :+,
82
+ self.si.__send__(
83
+ :[],
84
+ :b
85
+ )
86
+ ).__send__(
87
+ :+,
88
+ self.si.__send__(:+).__send__(
89
+ :[],
90
+ :rest
91
+ )
92
+ )) { || ([
93
+ self.a,
94
+ self.b,
95
+ self.rest
96
+ ])}.__send__(
97
+ :[],
98
+ :root
99
+ ))})})}}.instance
100
+ )
101
+ state = parser.parse([
102
+ :x,
103
+ :y,
104
+ :z
105
+ ])
106
+ self.assert_equal(
107
+ state.result.__send__(
108
+ :[],
109
+ :root
110
+ ),
111
+ [
112
+ :x,
113
+ :y,
114
+ [:z]
115
+ ]
116
+ )
117
+ )}
118
+ )}
119
+ )}}.instance)}}.instance
@@ -0,0 +1,131 @@
1
+
2
+ BasicSpec {
3
+ name: "Stream::Patterns"
4
+
5
+ new_parser: Stream::Parser.new
6
+
7
+ var shorthand: Common::Patterns::ShorthandMethods { }
8
+ si: |*args| shorthand.si(*args)
9
+ esi: |*args| shorthand.esi(*args)
10
+
11
+ match?: |pattern, *items| {
12
+ parser = new_parser
13
+ parser.grammar = Grammar {
14
+ [rules]
15
+ rule root: pattern
16
+ }
17
+ state = parser.parse(items)
18
+ state.end_idx == items.size
19
+ }
20
+
21
+ assert_match: |pattern, *items| assert(
22
+ match?(pattern, *items)
23
+ "Expected "pattern.inspect" to match "items.inspect"."
24
+ )
25
+
26
+ refute_match: |pattern, *items| assert(
27
+ !match?(pattern, *items)
28
+ "Expected "pattern.inspect" not to match "items.inspect"."
29
+ )
30
+
31
+ var test_item: BasicObject {
32
+ return_true: true
33
+ return_false: false
34
+ return_null: null
35
+ return_88: 88
36
+ return_99: 99
37
+ return_foo: :foo
38
+ return_bar: :bar
39
+ return_foo_s: "foo"
40
+ return_bar_s: "bar"
41
+ return_object: BasicObject.new
42
+ first_arg: |*a| a[0]
43
+ second_arg: |*a| a[1]
44
+ third_arg: |*a| a[2]
45
+ }
46
+
47
+ [tests]
48
+
49
+ "no checks": {
50
+ si |> assert_match(test_item)
51
+ si |> assert_match(true)
52
+ si |> assert_match(false)
53
+ si |> assert_match(null)
54
+ si |> assert_match(88)
55
+ si |> assert_match(99)
56
+ si |> assert_match(:foo)
57
+ si |> assert_match(:bar)
58
+ si |> assert_match("foo")
59
+ si |> assert_match("bar")
60
+ }
61
+
62
+ "single check with no arguments for literal result": {
63
+ si([:return_true, [], true ]) |> assert_match(test_item)
64
+ si([:return_false, [], false]) |> assert_match(test_item)
65
+ si([:return_null, [], null ]) |> assert_match(test_item)
66
+ si([:return_88, [], 88 ]) |> assert_match(test_item)
67
+ si([:return_99, [], 99 ]) |> assert_match(test_item)
68
+ si([:return_foo, [], :foo ]) |> assert_match(test_item)
69
+ si([:return_bar, [], :bar ]) |> assert_match(test_item)
70
+ si([:return_false, [], true ]) |> refute_match(test_item)
71
+ si([:return_null, [], true ]) |> refute_match(test_item)
72
+ si([:return_88, [], true ]) |> refute_match(test_item)
73
+ si([:return_null, [], false]) |> refute_match(test_item)
74
+ si([:return_false, [], null ]) |> refute_match(test_item)
75
+ si([:return_88, [], 99 ]) |> refute_match(test_item)
76
+ si([:return_99, [], 88 ]) |> refute_match(test_item)
77
+ si([:return_foo, [], :bar ]) |> refute_match(test_item)
78
+ si([:return_bar, [], :foo ]) |> refute_match(test_item)
79
+ si([:return_object, [], true ]) |> refute_match(test_item)
80
+ si([:return_object, [], false]) |> refute_match(test_item)
81
+ si([:return_object, [], null ]) |> refute_match(test_item)
82
+ }
83
+
84
+ "single check with no arguments for nonliteral result": {
85
+ si([:return_foo_s, [], "foo"]) |> assert_match(test_item)
86
+ si([:return_bar_s, [], "bar"]) |> assert_match(test_item)
87
+ si([:return_foo_s, [], "bar"]) |> refute_match(test_item)
88
+ si([:return_bar_s, [], "foo"]) |> refute_match(test_item)
89
+ si([:return_true, [], "bar"]) |> refute_match(test_item)
90
+ si([:return_false, [], "bar"]) |> refute_match(test_item)
91
+ si([:return_null, [], "bar"]) |> refute_match(test_item)
92
+ si([:return_88, [], "bar"]) |> refute_match(test_item)
93
+ si([:return_99, [], "bar"]) |> refute_match(test_item)
94
+ si([:return_object, [], "bar"]) |> refute_match(test_item)
95
+ si([:return_object, [], test_item.return_object]) |> refute_match(test_item)
96
+ }
97
+
98
+ "single check with arguments": {
99
+ si([:first_arg, [:x,"y",3], :x ]) |> assert_match(test_item)
100
+ si([:second_arg, [:x,"y",3], "y" ]) |> assert_match(test_item)
101
+ si([:third_arg, [:x,"y",3], 3 ]) |> assert_match(test_item)
102
+ si([:first_arg, [:x,"y",3], true ]) |> refute_match(test_item)
103
+ si([:second_arg, [:x,"y",3], false]) |> refute_match(test_item)
104
+ si([:third_arg, [:x,"y",3], null ]) |> refute_match(test_item)
105
+ }
106
+
107
+ "multiple checks": {
108
+ si([:return_true, [], true], [:first_arg, [:x,"y",3], :x]) |> assert_match(test_item)
109
+ si([:return_true, [], false], [:first_arg, [:x,"y",3], :x]) |> refute_match(test_item)
110
+ si([:return_true, [], true], [:first_arg, [:x,"y",3], 88]) |> refute_match(test_item)
111
+ si([:return_true, [], false], [:first_arg, [:x,"y",3], 88]) |> refute_match(test_item)
112
+ }
113
+
114
+ "with :self as check method, checks the item directly against the result": {
115
+ si([:self, [], 88]) |> assert_match(88)
116
+ si([:self, [], 99]) |> refute_match(88)
117
+ }
118
+
119
+ "with block literal as check method, runs the block with the item as self": {
120
+ si([&{ self.return_88 }, [], 88]) |> assert_match(test_item)
121
+ si([&{ self.return_99 }, [], 88]) |> refute_match(test_item)
122
+ si([&|a,b,c|{ self.return_88 + (a * b) - c }, [2,3,4], 90]) |> assert_match(test_item)
123
+ si([&|a,b,c|{ self.return_99 + (a * b) - c }, [2,3,4], 90]) |> refute_match(test_item)
124
+ }
125
+
126
+ "end of stream pattern": {
127
+ esi |> assert_match()
128
+ esi |> refute_match(test_item)
129
+ esi |> refute_match(test_item, test_item)
130
+ }
131
+ }
@@ -0,0 +1,595 @@
1
+
2
+ ::Myco::Component.new([::Myco::FileToplevel], ::Myco.cscope.for_method_definition, __FILE__, __LINE__)
3
+ .tap { |__c__| __c__.__last__ = __c__.component_eval {(::Myco::Component.new([::Myco.find_constant(:BasicSpec)], ::Myco.cscope.for_method_definition, __FILE__, __LINE__)
4
+ .tap { |__c__| __c__.__last__ = __c__.component_eval {(
5
+ declare_meme(:name, [], nil, ::Myco.cscope.dup) { |*| ("Stream::Patterns")}
6
+ declare_meme(:new_parser, [], nil, ::Myco.cscope.dup) { |*| (::Myco.find_constant(:Stream)::Parser.new)}
7
+ declare_meme(:shorthand, [[:var, []]], nil, ::Myco.cscope.dup) { |*| (::Myco::Component.new([::Myco.find_constant(:Common)::Patterns::ShorthandMethods], ::Myco.cscope.for_method_definition, __FILE__, __LINE__)
8
+ .tap { |__c__| __c__.__last__ = __c__.component_eval {nil}}.instance)}
9
+ declare_meme(:si, [], nil, ::Myco.cscope.dup) { |*args| (self.shorthand.si(*args))}
10
+ declare_meme(:esi, [], nil, ::Myco.cscope.dup) { |*args| (self.shorthand.esi(*args))}
11
+ declare_meme(:match?, [], nil, ::Myco.cscope.dup) { |pattern, *items| (
12
+ parser = self.new_parser
13
+ parser.__send__(
14
+ :grammar=,
15
+ ::Myco::Component.new([::Myco.find_constant(:Grammar)], ::Myco.cscope.for_method_definition, __FILE__, __LINE__)
16
+ .tap { |__c__| __c__.__last__ = __c__.component_eval {(__category__(:rules).component_eval {(declare_meme(:root, [[:rule, []]], nil, ::Myco.cscope.dup) { |*| (pattern)})})}}.instance
17
+ )
18
+ state = parser.parse(items)
19
+ state.end_idx.__send__(
20
+ :==,
21
+ items.size
22
+ )
23
+ )}
24
+ declare_meme(:assert_match, [], nil, ::Myco.cscope.dup) { |pattern, *items| (self.assert(
25
+ self.__send__(
26
+ :match?,
27
+ pattern,
28
+ *items
29
+ ),
30
+ "Expected #{pattern.inspect} to match #{items.inspect}."
31
+ ))}
32
+ declare_meme(:refute_match, [], nil, ::Myco.cscope.dup) { |pattern, *items| (self.assert(
33
+ self.__send__(
34
+ :match?,
35
+ pattern,
36
+ *items
37
+ ).__send__(:!),
38
+ "Expected #{pattern.inspect} not to match #{items.inspect}."
39
+ ))}
40
+ declare_meme(:test_item, [[:var, []]], nil, ::Myco.cscope.dup) { |*| (::Myco::Component.new([::Myco.find_constant(:BasicObject)], ::Myco.cscope.for_method_definition, __FILE__, __LINE__)
41
+ .tap { |__c__| __c__.__last__ = __c__.component_eval {(
42
+ declare_meme(:return_true, [], nil, ::Myco.cscope.dup) { |*| (true)}
43
+ declare_meme(:return_false, [], nil, ::Myco.cscope.dup) { |*| (false)}
44
+ declare_meme(:return_null, [], nil, ::Myco.cscope.dup) { |*| (nil)}
45
+ declare_meme(:return_88, [], nil, ::Myco.cscope.dup) { |*| (88)}
46
+ declare_meme(:return_99, [], nil, ::Myco.cscope.dup) { |*| (99)}
47
+ declare_meme(:return_foo, [], nil, ::Myco.cscope.dup) { |*| (:foo)}
48
+ declare_meme(:return_bar, [], nil, ::Myco.cscope.dup) { |*| (:bar)}
49
+ declare_meme(:return_foo_s, [], nil, ::Myco.cscope.dup) { |*| ("foo")}
50
+ declare_meme(:return_bar_s, [], nil, ::Myco.cscope.dup) { |*| ("bar")}
51
+ declare_meme(:return_object, [], nil, ::Myco.cscope.dup) { |*| (::Myco.find_constant(:BasicObject).new)}
52
+ declare_meme(:first_arg, [], nil, ::Myco.cscope.dup) { |*a| (a.__send__(
53
+ :[],
54
+ 0
55
+ ))}
56
+ declare_meme(:second_arg, [], nil, ::Myco.cscope.dup) { |*a| (a.__send__(
57
+ :[],
58
+ 1
59
+ ))}
60
+ declare_meme(:third_arg, [], nil, ::Myco.cscope.dup) { |*a| (a.__send__(
61
+ :[],
62
+ 2
63
+ ))}
64
+ )}}.instance)}
65
+ __category__(:tests).component_eval {(
66
+ declare_meme(:"no checks", [], nil, ::Myco.cscope.dup) { |*| (
67
+ self.assert_match(
68
+ self.si,
69
+ self.test_item
70
+ )
71
+ self.assert_match(
72
+ self.si,
73
+ true
74
+ )
75
+ self.assert_match(
76
+ self.si,
77
+ false
78
+ )
79
+ self.assert_match(
80
+ self.si,
81
+ nil
82
+ )
83
+ self.assert_match(
84
+ self.si,
85
+ 88
86
+ )
87
+ self.assert_match(
88
+ self.si,
89
+ 99
90
+ )
91
+ self.assert_match(
92
+ self.si,
93
+ :foo
94
+ )
95
+ self.assert_match(
96
+ self.si,
97
+ :bar
98
+ )
99
+ self.assert_match(
100
+ self.si,
101
+ "foo"
102
+ )
103
+ self.assert_match(
104
+ self.si,
105
+ "bar"
106
+ )
107
+ )}
108
+ declare_meme(:"single check with no arguments for literal result", [], nil, ::Myco.cscope.dup) { |*| (
109
+ self.assert_match(
110
+ self.si([
111
+ :return_true,
112
+ [],
113
+ true
114
+ ]),
115
+ self.test_item
116
+ )
117
+ self.assert_match(
118
+ self.si([
119
+ :return_false,
120
+ [],
121
+ false
122
+ ]),
123
+ self.test_item
124
+ )
125
+ self.assert_match(
126
+ self.si([
127
+ :return_null,
128
+ [],
129
+ nil
130
+ ]),
131
+ self.test_item
132
+ )
133
+ self.assert_match(
134
+ self.si([
135
+ :return_88,
136
+ [],
137
+ 88
138
+ ]),
139
+ self.test_item
140
+ )
141
+ self.assert_match(
142
+ self.si([
143
+ :return_99,
144
+ [],
145
+ 99
146
+ ]),
147
+ self.test_item
148
+ )
149
+ self.assert_match(
150
+ self.si([
151
+ :return_foo,
152
+ [],
153
+ :foo
154
+ ]),
155
+ self.test_item
156
+ )
157
+ self.assert_match(
158
+ self.si([
159
+ :return_bar,
160
+ [],
161
+ :bar
162
+ ]),
163
+ self.test_item
164
+ )
165
+ self.refute_match(
166
+ self.si([
167
+ :return_false,
168
+ [],
169
+ true
170
+ ]),
171
+ self.test_item
172
+ )
173
+ self.refute_match(
174
+ self.si([
175
+ :return_null,
176
+ [],
177
+ true
178
+ ]),
179
+ self.test_item
180
+ )
181
+ self.refute_match(
182
+ self.si([
183
+ :return_88,
184
+ [],
185
+ true
186
+ ]),
187
+ self.test_item
188
+ )
189
+ self.refute_match(
190
+ self.si([
191
+ :return_null,
192
+ [],
193
+ false
194
+ ]),
195
+ self.test_item
196
+ )
197
+ self.refute_match(
198
+ self.si([
199
+ :return_false,
200
+ [],
201
+ nil
202
+ ]),
203
+ self.test_item
204
+ )
205
+ self.refute_match(
206
+ self.si([
207
+ :return_88,
208
+ [],
209
+ 99
210
+ ]),
211
+ self.test_item
212
+ )
213
+ self.refute_match(
214
+ self.si([
215
+ :return_99,
216
+ [],
217
+ 88
218
+ ]),
219
+ self.test_item
220
+ )
221
+ self.refute_match(
222
+ self.si([
223
+ :return_foo,
224
+ [],
225
+ :bar
226
+ ]),
227
+ self.test_item
228
+ )
229
+ self.refute_match(
230
+ self.si([
231
+ :return_bar,
232
+ [],
233
+ :foo
234
+ ]),
235
+ self.test_item
236
+ )
237
+ self.refute_match(
238
+ self.si([
239
+ :return_object,
240
+ [],
241
+ true
242
+ ]),
243
+ self.test_item
244
+ )
245
+ self.refute_match(
246
+ self.si([
247
+ :return_object,
248
+ [],
249
+ false
250
+ ]),
251
+ self.test_item
252
+ )
253
+ self.refute_match(
254
+ self.si([
255
+ :return_object,
256
+ [],
257
+ nil
258
+ ]),
259
+ self.test_item
260
+ )
261
+ )}
262
+ declare_meme(:"single check with no arguments for nonliteral result", [], nil, ::Myco.cscope.dup) { |*| (
263
+ self.assert_match(
264
+ self.si([
265
+ :return_foo_s,
266
+ [],
267
+ "foo"
268
+ ]),
269
+ self.test_item
270
+ )
271
+ self.assert_match(
272
+ self.si([
273
+ :return_bar_s,
274
+ [],
275
+ "bar"
276
+ ]),
277
+ self.test_item
278
+ )
279
+ self.refute_match(
280
+ self.si([
281
+ :return_foo_s,
282
+ [],
283
+ "bar"
284
+ ]),
285
+ self.test_item
286
+ )
287
+ self.refute_match(
288
+ self.si([
289
+ :return_bar_s,
290
+ [],
291
+ "foo"
292
+ ]),
293
+ self.test_item
294
+ )
295
+ self.refute_match(
296
+ self.si([
297
+ :return_true,
298
+ [],
299
+ "bar"
300
+ ]),
301
+ self.test_item
302
+ )
303
+ self.refute_match(
304
+ self.si([
305
+ :return_false,
306
+ [],
307
+ "bar"
308
+ ]),
309
+ self.test_item
310
+ )
311
+ self.refute_match(
312
+ self.si([
313
+ :return_null,
314
+ [],
315
+ "bar"
316
+ ]),
317
+ self.test_item
318
+ )
319
+ self.refute_match(
320
+ self.si([
321
+ :return_88,
322
+ [],
323
+ "bar"
324
+ ]),
325
+ self.test_item
326
+ )
327
+ self.refute_match(
328
+ self.si([
329
+ :return_99,
330
+ [],
331
+ "bar"
332
+ ]),
333
+ self.test_item
334
+ )
335
+ self.refute_match(
336
+ self.si([
337
+ :return_object,
338
+ [],
339
+ "bar"
340
+ ]),
341
+ self.test_item
342
+ )
343
+ self.refute_match(
344
+ self.si([
345
+ :return_object,
346
+ [],
347
+ self.test_item.return_object
348
+ ]),
349
+ self.test_item
350
+ )
351
+ )}
352
+ declare_meme(:"single check with arguments", [], nil, ::Myco.cscope.dup) { |*| (
353
+ self.assert_match(
354
+ self.si([
355
+ :first_arg,
356
+ [
357
+ :x,
358
+ "y",
359
+ 3
360
+ ],
361
+ :x
362
+ ]),
363
+ self.test_item
364
+ )
365
+ self.assert_match(
366
+ self.si([
367
+ :second_arg,
368
+ [
369
+ :x,
370
+ "y",
371
+ 3
372
+ ],
373
+ "y"
374
+ ]),
375
+ self.test_item
376
+ )
377
+ self.assert_match(
378
+ self.si([
379
+ :third_arg,
380
+ [
381
+ :x,
382
+ "y",
383
+ 3
384
+ ],
385
+ 3
386
+ ]),
387
+ self.test_item
388
+ )
389
+ self.refute_match(
390
+ self.si([
391
+ :first_arg,
392
+ [
393
+ :x,
394
+ "y",
395
+ 3
396
+ ],
397
+ true
398
+ ]),
399
+ self.test_item
400
+ )
401
+ self.refute_match(
402
+ self.si([
403
+ :second_arg,
404
+ [
405
+ :x,
406
+ "y",
407
+ 3
408
+ ],
409
+ false
410
+ ]),
411
+ self.test_item
412
+ )
413
+ self.refute_match(
414
+ self.si([
415
+ :third_arg,
416
+ [
417
+ :x,
418
+ "y",
419
+ 3
420
+ ],
421
+ nil
422
+ ]),
423
+ self.test_item
424
+ )
425
+ )}
426
+ declare_meme(:"multiple checks", [], nil, ::Myco.cscope.dup) { |*| (
427
+ self.assert_match(
428
+ self.si(
429
+ [
430
+ :return_true,
431
+ [],
432
+ true
433
+ ],
434
+ [
435
+ :first_arg,
436
+ [
437
+ :x,
438
+ "y",
439
+ 3
440
+ ],
441
+ :x
442
+ ]
443
+ ),
444
+ self.test_item
445
+ )
446
+ self.refute_match(
447
+ self.si(
448
+ [
449
+ :return_true,
450
+ [],
451
+ false
452
+ ],
453
+ [
454
+ :first_arg,
455
+ [
456
+ :x,
457
+ "y",
458
+ 3
459
+ ],
460
+ :x
461
+ ]
462
+ ),
463
+ self.test_item
464
+ )
465
+ self.refute_match(
466
+ self.si(
467
+ [
468
+ :return_true,
469
+ [],
470
+ true
471
+ ],
472
+ [
473
+ :first_arg,
474
+ [
475
+ :x,
476
+ "y",
477
+ 3
478
+ ],
479
+ 88
480
+ ]
481
+ ),
482
+ self.test_item
483
+ )
484
+ self.refute_match(
485
+ self.si(
486
+ [
487
+ :return_true,
488
+ [],
489
+ false
490
+ ],
491
+ [
492
+ :first_arg,
493
+ [
494
+ :x,
495
+ "y",
496
+ 3
497
+ ],
498
+ 88
499
+ ]
500
+ ),
501
+ self.test_item
502
+ )
503
+ )}
504
+ declare_meme(:"with :self as check method, checks the item directly against the result", [], nil, ::Myco.cscope.dup) { |*| (
505
+ self.assert_match(
506
+ self.si([
507
+ :self,
508
+ [],
509
+ 88
510
+ ]),
511
+ 88
512
+ )
513
+ self.refute_match(
514
+ self.si([
515
+ :self,
516
+ [],
517
+ 99
518
+ ]),
519
+ 88
520
+ )
521
+ )}
522
+ declare_meme(:"with block literal as check method, runs the block with the item as self", [], nil, ::Myco.cscope.dup) { |*| (
523
+ self.assert_match(
524
+ self.si([
525
+ ::Object::Proc.new { || (self.__send__(:return_88))},
526
+ [],
527
+ 88
528
+ ]),
529
+ self.test_item
530
+ )
531
+ self.refute_match(
532
+ self.si([
533
+ ::Object::Proc.new { || (self.__send__(:return_99))},
534
+ [],
535
+ 88
536
+ ]),
537
+ self.test_item
538
+ )
539
+ self.assert_match(
540
+ self.si([
541
+ ::Object::Proc.new { |a, b, c| (self.__send__(:return_88).__send__(
542
+ :+,
543
+ a.__send__(
544
+ :*,
545
+ b
546
+ )
547
+ ).__send__(
548
+ :-,
549
+ c
550
+ ))},
551
+ [
552
+ 2,
553
+ 3,
554
+ 4
555
+ ],
556
+ 90
557
+ ]),
558
+ self.test_item
559
+ )
560
+ self.refute_match(
561
+ self.si([
562
+ ::Object::Proc.new { |a, b, c| (self.__send__(:return_99).__send__(
563
+ :+,
564
+ a.__send__(
565
+ :*,
566
+ b
567
+ )
568
+ ).__send__(
569
+ :-,
570
+ c
571
+ ))},
572
+ [
573
+ 2,
574
+ 3,
575
+ 4
576
+ ],
577
+ 90
578
+ ]),
579
+ self.test_item
580
+ )
581
+ )}
582
+ declare_meme(:"end of stream pattern", [], nil, ::Myco.cscope.dup) { |*| (
583
+ self.assert_match(self.esi)
584
+ self.refute_match(
585
+ self.esi,
586
+ self.test_item
587
+ )
588
+ self.refute_match(
589
+ self.esi,
590
+ self.test_item,
591
+ self.test_item
592
+ )
593
+ )}
594
+ )}
595
+ )}}.instance)}}.instance