sexp_processor 4.12.1 → 4.13.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -34,7 +34,7 @@ require "sexp"
34
34
  class SexpProcessor
35
35
 
36
36
  # duh
37
- VERSION = "4.12.1"
37
+ VERSION = "4.13.0"
38
38
 
39
39
  ##
40
40
  # Automatically shifts off the Sexp type before handing the
@@ -233,16 +233,16 @@ class TestSexp < SexpTestCase # ZenTest FULL
233
233
  end
234
234
 
235
235
  def test_equal3_subset_match
236
- assert_match s{s(:a)}, s(s(:a), s(:b)) # left - =~
237
- assert_equal3 s{s(:a)}, s(s(:a), s(:b)) # left - ===
238
- assert_equal3 s{s(:a)}, s(:blah, s(:a ), s(:b)) # mid 1
239
- assert_equal3 s{s(:a, 1)}, s(:blah, s(:a, 1), s(:b)) # mid 2
240
- assert_equal3 s{s(:a)}, s(:blah, s(:blah, s(:a))) # left deeper
236
+ assert_match s{q(:a)}, s(s(:a), s(:b)) # left - =~
237
+ assert_equal3 s{q(:a)}, s(s(:a), s(:b)) # left - ===
238
+ assert_equal3 s{q(:a)}, s(:blah, s(:a ), s(:b)) # mid 1
239
+ assert_equal3 s{q(:a, 1)}, s(:blah, s(:a, 1), s(:b)) # mid 2
240
+ assert_equal3 s{q(:a)}, s(:blah, s(:blah, s(:a))) # left deeper
241
241
  end
242
242
 
243
243
  def test_equalstilde_fancy
244
- assert_match s{ s(:b) }, s(:a, s(:b), :c)
245
- assert_match s(:a, s(:b), :c), s{ s(:b) }
244
+ assert_match s{ q(:b) }, s(:a, s(:b), :c)
245
+ assert_match s(:a, s(:b), :c), s{ q(:b) }
246
246
 
247
247
  e = assert_raises ArgumentError do
248
248
  s(:b) =~ s(:a, s(:b), :c)
@@ -256,8 +256,8 @@ class TestSexp < SexpTestCase # ZenTest FULL
256
256
  end
257
257
 
258
258
  def test_equalstilde_plain
259
- s{ s(:re) } =~ s(:data) # pattern on LHS
260
- s(:data) =~ s{ s(:re) } # pattern on RHS
259
+ s{ q(:re) } =~ s(:data) # pattern on LHS
260
+ s(:data) =~ s{ q(:re) } # pattern on RHS
261
261
 
262
262
  e = assert_raises ArgumentError do
263
263
  s(:re) =~ s(:data) # no pattern
@@ -297,10 +297,10 @@ class TestSexp < SexpTestCase # ZenTest FULL
297
297
  end
298
298
 
299
299
  def test_gsub_matcher
300
- assert_gsub s(:a, :b, :c), s(:a, s(:b, 42), :c), s{ s(:b, _) }, :b
301
- assert_gsub s(:a, s(:b), :c), s(:a, s(:b), :c), s{ s(:b, _) }, :b
302
- assert_gsub s(:a, s(:c, :b), :d), s(:a, s(:c, s(:b, 42)), :d), s{ s(:b, _) }, :b
303
- assert_gsub s(:a, s(:q), :c), s(:a, s(:q), :c), s{ s(:b, _) }, :b
300
+ assert_gsub s(:a, :b, :c), s(:a, s(:b, 42), :c), s{ q(:b, _) }, :b
301
+ assert_gsub s(:a, s(:b), :c), s(:a, s(:b), :c), s{ q(:b, _) }, :b
302
+ assert_gsub s(:a, s(:c, :b), :d), s(:a, s(:c, s(:b, 42)), :d), s{ q(:b, _) }, :b
303
+ assert_gsub s(:a, s(:q), :c), s(:a, s(:q), :c), s{ q(:b, _) }, :b
304
304
  end
305
305
 
306
306
  def with_env key
@@ -589,14 +589,14 @@ class TestSexp < SexpTestCase # ZenTest FULL
589
589
  end
590
590
 
591
591
  def test_sub_matcher
592
- assert_sub s(:c), s(:b), s{ s(:b) }, s(:c)
593
- assert_sub s(:a, s(:c), s(:b)), s(:a, s(:b), s(:b)), s{ s(:b) }, s(:c)
594
- assert_sub s(:a, s(:c), s(:a)), s(:a, s(:b), s(:a)), s{ s(:b) }, s(:c)
592
+ assert_sub s(:c), s(:b), s{ q(:b) }, s(:c)
593
+ assert_sub s(:a, s(:c), s(:b)), s(:a, s(:b), s(:b)), s{ q(:b) }, s(:c)
594
+ assert_sub s(:a, s(:c), s(:a)), s(:a, s(:b), s(:a)), s{ q(:b) }, s(:c)
595
595
 
596
- assert_sub s(:a, :b, :c), s(:a, s(:b, 42), :c), s{ s(:b, _) }, :b
597
- assert_sub s(:a, s(:b), :c), s(:a, s(:b), :c), s{ s(:b, _) }, :b
598
- assert_sub s(:a, s(:c, :b), :d), s(:a, s(:c, s(:b, 42)), :d), s{ s(:b, _) }, :b
599
- assert_sub s(:a, s(:q), :c), s(:a, s(:q), :c), s{ s(:b, _) }, :b
596
+ assert_sub s(:a, :b, :c), s(:a, s(:b, 42), :c), s{ q(:b, _) }, :b
597
+ assert_sub s(:a, s(:b), :c), s(:a, s(:b), :c), s{ q(:b, _) }, :b
598
+ assert_sub s(:a, s(:c, :b), :d), s(:a, s(:c, s(:b, 42)), :d), s{ q(:b, _) }, :b
599
+ assert_sub s(:a, s(:q), :c), s(:a, s(:q), :c), s{ q(:b, _) }, :b
600
600
  end
601
601
 
602
602
  def test_sub_structure
@@ -682,7 +682,7 @@ end # TestSexp
682
682
 
683
683
  class TestSexpMatcher < SexpTestCase
684
684
  def test_cls_s
685
- assert_equal M.s(:x), s{ s(:x) }
685
+ assert_equal M.q(:x), s{ q(:x) }
686
686
  end
687
687
 
688
688
  def test_cls_underscore
@@ -702,19 +702,19 @@ class TestSexpMatcher < SexpTestCase
702
702
  end
703
703
 
704
704
  def test_cls_any
705
- assert_equal M::Any.new(M.s(:a), M.s(:b)), s{ any(s(:a), s(:b)) }
705
+ assert_equal M::Any.new(M.q(:a), M.q(:b)), s{ any(q(:a), q(:b)) }
706
706
  end
707
707
 
708
708
  def test_cls_all
709
- assert_equal M::All.new(M.s(:a), M.s(:b)), s{ all(s(:a), s(:b)) }
709
+ assert_equal M::All.new(M.q(:a), M.q(:b)), s{ all(q(:a), q(:b)) }
710
710
  end
711
711
 
712
712
  def test_cls_not_eh
713
- assert_equal M::Not.new(M.s(:a)), s{ not?(s(:a)) }
713
+ assert_equal M::Not.new(M.q(:a)), s{ not?(q(:a)) }
714
714
  end
715
715
 
716
716
  def test_cls_child
717
- assert_equal M::Child.new(M.s(:a)), s{ child(s(:a)) }
717
+ assert_equal M::Child.new(M.q(:a)), s{ child(q(:a)) }
718
718
  end
719
719
 
720
720
  def test_cls_t
@@ -730,37 +730,37 @@ class TestSexpMatcher < SexpTestCase
730
730
  end
731
731
 
732
732
  def test_amp
733
- m = s{ s(:a) & s(:b) }
734
- e = M::All.new(M.s(:a), M.s(:b))
733
+ m = s{ q(:a) & q(:b) }
734
+ e = M::All.new(M.q(:a), M.q(:b))
735
735
 
736
736
  assert_equal e, m
737
737
  end
738
738
 
739
739
  def test_pipe
740
- m = s{ s(:a) | s(:b) }
741
- e = M::Any.new(M.s(:a), M.s(:b))
740
+ m = s{ q(:a) | q(:b) }
741
+ e = M::Any.new(M.q(:a), M.q(:b))
742
742
 
743
743
  assert_equal e, m
744
744
  end
745
745
 
746
746
  def test_unary_minus
747
- assert_equal M::Not.new(M.s(:a)), s{ -s(:a) }
747
+ assert_equal M::Not.new(M.q(:a)), s{ -q(:a) }
748
748
  end
749
749
 
750
750
  def test_rchevron
751
- assert_equal M::Sibling.new(M.s(:a), M.s(:b)), s{ s(:a) >> s(:b) }
751
+ assert_equal M::Sibling.new(M.q(:a), M.q(:b)), s{ q(:a) >> q(:b) }
752
752
  end
753
753
 
754
754
  def test_greedy_eh
755
- refute_operator s{ s(:a) }, :greedy?
755
+ refute_operator s{ q(:a) }, :greedy?
756
756
  end
757
757
 
758
758
  def test_inspect
759
- assert_inspect "q(:a)", s{ s(:a) }
759
+ assert_inspect "q(:a)", s{ q(:a) }
760
760
  end
761
761
 
762
762
  def test_pretty_print
763
- assert_pretty_print "q(:a)", s{ s(:a) }
763
+ assert_pretty_print "q(:a)", s{ q(:a) }
764
764
  end
765
765
  end # class TestSexpMatcher
766
766
 
@@ -790,11 +790,11 @@ class TestWild < MatcherTestCase
790
790
  def test_wild_search # TODO: possibly remove
791
791
  sexp = CLASS_SEXP.dup
792
792
 
793
- assert_search 1, s(:add, :a, :b), s{ s(:add, _, :b) }
794
- assert_search 1, sexp, s{ s(:defn, :bar, _, _) }
795
- assert_search 2, sexp, s{ s(:defn, _, _, s(_, :a, :b) ) }
796
- assert_search 1, s(:a, s()), s{ s(:a, _) }
797
- assert_search 1, s(:a, :b, :c), s{ s(_, _, _) }
793
+ assert_search 1, s(:add, :a, :b), s{ q(:add, _, :b) }
794
+ assert_search 1, sexp, s{ q(:defn, :bar, _, _) }
795
+ assert_search 2, sexp, s{ q(:defn, _, _, q(_, :a, :b) ) }
796
+ assert_search 1, s(:a, s()), s{ q(:a, _) }
797
+ assert_search 1, s(:a, :b, :c), s{ q(_, _, _) }
798
798
  assert_search 7, sexp, s{ _ }
799
799
  end
800
800
  end
@@ -815,8 +815,8 @@ class TestRemaining < MatcherTestCase
815
815
  def test_remaining_satisfy_eh # TODO: possibly remove
816
816
  assert_satisfy s{ ___ }, s(:a)
817
817
  assert_satisfy s{ ___ }, s(:a, :b, :c)
818
- assert_satisfy s{ s(:x, ___ ) }, s(:x, :y)
819
- refute_satisfy s{ s(:y, ___ ) }, s(:x, :y)
818
+ assert_satisfy s{ q(:x, ___ ) }, s(:x, :y)
819
+ refute_satisfy s{ q(:y, ___ ) }, s(:x, :y)
820
820
  end
821
821
 
822
822
  def test_greedy
@@ -826,7 +826,7 @@ end
826
826
 
827
827
  class TestAny < MatcherTestCase
828
828
  def matcher
829
- s{ s(:a) | s(:c) }
829
+ s{ q(:a) | q(:c) }
830
830
  end
831
831
 
832
832
  def inspect_str
@@ -838,26 +838,26 @@ class TestAny < MatcherTestCase
838
838
  end
839
839
 
840
840
  def test_any_search # TODO: possibly remove
841
- assert_search 2, s(:foo, s(:a), s(:b)), s{ s(any(:a, :b)) }
842
- assert_search 1, s(:foo, s(:a), s(:b)), s{ any( s(:a), s(:c)) }
841
+ assert_search 2, s(:foo, s(:a), s(:b)), s{ q(any(:a, :b)) }
842
+ assert_search 1, s(:foo, s(:a), s(:b)), s{ any( q(:a), q(:c)) }
843
843
  end
844
844
 
845
845
  def test_or_satisfy_eh # TODO: possibly remove
846
- assert_satisfy s{ s(:a) | s(:b) }, s(:a)
847
- refute_satisfy s{ s(:a) | s(:b) }, s(:c)
846
+ assert_satisfy s{ q(:a) | q(:b) }, s(:a)
847
+ refute_satisfy s{ q(:a) | q(:b) }, s(:c)
848
848
  end
849
849
 
850
850
  def test_or_search # TODO: possibly remove
851
851
  sexp = CLASS_SEXP.dup
852
852
 
853
- assert_search 2, s(:a, s(:b, :c), s(:b, :d)), s{ s(:b, :c) | s(:b, :d) }
854
- assert_search 2, sexp, s{ s(:add, :a, :b) | s(:defn, :bar, _, _) }
853
+ assert_search 2, s(:a, s(:b, :c), s(:b, :d)), s{ q(:b, :c) | q(:b, :d) }
854
+ assert_search 2, sexp, s{ q(:add, :a, :b) | q(:defn, :bar, _, _) }
855
855
  end
856
856
  end
857
857
 
858
858
  class TestAll < MatcherTestCase
859
859
  def matcher
860
- s{ s(:a) & s(:a) }
860
+ s{ q(:a) & q(:a) }
861
861
  end
862
862
 
863
863
  def inspect_str
@@ -869,14 +869,14 @@ class TestAll < MatcherTestCase
869
869
  end
870
870
 
871
871
  def test_and_satisfy_eh # TODO: possibly remove
872
- refute_satisfy s{ s(:a) & s(:b) }, s(:a)
873
- assert_satisfy s{ s(:a) & s(atom) }, s(:a)
872
+ refute_satisfy s{ q(:a) & q(:b) }, s(:a)
873
+ assert_satisfy s{ q(:a) & q(atom) }, s(:a)
874
874
  end
875
875
  end
876
876
 
877
877
  class TestNot < MatcherTestCase
878
878
  def matcher
879
- s{ not? s(:b) } # TODO: test unary minus
879
+ s{ not? q(:b) } # TODO: test unary minus
880
880
  end
881
881
 
882
882
  def inspect_str
@@ -889,16 +889,16 @@ class TestNot < MatcherTestCase
889
889
 
890
890
  def test_not_satisfy_eh # TODO: possibly remove
891
891
  refute_satisfy s{ -_ }, s(:a)
892
- assert_satisfy s{ -s(:b) }, s(:a)
893
- assert_satisfy s{ not?(s(:b)) }, s(:a)
894
- refute_satisfy s{ -s(atom) }, s(:a)
895
- assert_satisfy s{ s(not?(:b)) }, s(:a)
892
+ assert_satisfy s{ -q(:b) }, s(:a)
893
+ assert_satisfy s{ not?(q(:b)) }, s(:a)
894
+ refute_satisfy s{ -q(atom) }, s(:a)
895
+ assert_satisfy s{ q(not?(:b)) }, s(:a)
896
896
  end
897
897
  end
898
898
 
899
899
  class TestChild < MatcherTestCase
900
900
  def matcher
901
- s{ child(s(:a)) }
901
+ s{ child(q(:a)) }
902
902
  end
903
903
 
904
904
  def sexp
@@ -916,8 +916,8 @@ class TestChild < MatcherTestCase
916
916
  def test_child_search # TODO: possibly remove
917
917
  sexp = CLASS_SEXP.dup
918
918
 
919
- assert_search 1, sexp, s{ s(:class, :cake, _, _, child( s(:sub, :a, :b) ) ) }
920
- assert_search 1, sexp, s{ s(:class, :cake, _, _, child(include(:a))) }
919
+ assert_search 1, sexp, s{ q(:class, :cake, _, _, child( q(:sub, :a, :b) ) ) }
920
+ assert_search 1, sexp, s{ q(:class, :cake, _, _, child(include(:a))) }
921
921
  end
922
922
 
923
923
  def test_satisfy_eh_by_child
@@ -954,15 +954,15 @@ class TestAtom < MatcherTestCase
954
954
  def test_atom_search # TODO: possibly remove
955
955
  sexp = CLASS_SEXP.dup
956
956
 
957
- assert_search 1, s(:add, :a, :b), s{ s(:add, atom, :b) }
958
- assert_search 2, sexp, s{ s(:defn, atom, _, s(atom, :a, :b) ) }
959
- assert_search 0, s(:a, s()), s{ s(:a, atom) }
957
+ assert_search 1, s(:add, :a, :b), s{ q(:add, atom, :b) }
958
+ assert_search 2, sexp, s{ q(:defn, atom, _, q(atom, :a, :b) ) }
959
+ assert_search 0, s(:a, s()), s{ q(:a, atom) }
960
960
  end
961
961
  end
962
962
 
963
963
  class TestPattern < MatcherTestCase
964
964
  def matcher
965
- s{ s(:a, m(/a/)) }
965
+ s{ q(:a, m(/a/)) }
966
966
  end
967
967
 
968
968
  def sexp
@@ -984,15 +984,15 @@ class TestPattern < MatcherTestCase
984
984
  def test_pattern_search # TODO: possibly remove
985
985
  sexp = CLASS_SEXP.dup
986
986
 
987
- assert_search 2, sexp, s{ s(m(/\w{3}/), :a, :b) }
987
+ assert_search 2, sexp, s{ q(m(/\w{3}/), :a, :b) }
988
988
 
989
989
  assert_search 0, s(:a), s{ m(/\w/) }
990
- assert_search 1, s(:a), s{ s(m(/\w/)) }
990
+ assert_search 1, s(:a), s{ q(m(/\w/)) }
991
991
  assert_search 0, s(:a), s{ m(/\w/,/\d/) }
992
- assert_search 1, s(:a), s{ s(m(/\w/,/\d/)) }
992
+ assert_search 1, s(:a), s{ q(m(/\w/,/\d/)) }
993
993
 
994
994
  assert_search 0, s(:tests, s(s(:test_a), s(:test_b))), s{ m(/test_\w/) }
995
- assert_search 2, s(:tests, s(s(:test_a), s(:test_b))), s{ s(m(/test_\w/)) }
995
+ assert_search 2, s(:tests, s(s(:test_a), s(:test_b))), s{ q(m(/test_\w/)) }
996
996
  end
997
997
  end
998
998
 
@@ -1021,7 +1021,7 @@ class TestInclude < MatcherTestCase
1021
1021
  end
1022
1022
 
1023
1023
  def matcher
1024
- s{ include(s(:a)) }
1024
+ s{ include(q(:a)) }
1025
1025
  end
1026
1026
 
1027
1027
  def inspect_str
@@ -1033,9 +1033,9 @@ class TestInclude < MatcherTestCase
1033
1033
 
1034
1034
  assert_search 1, s(:add, :a, :b), s{ include(:a) }
1035
1035
  assert_search 1, sexp, s{ include(:bar) }
1036
- assert_search 2, sexp, s{ s(:defn, atom, _, include(:a)) }
1036
+ assert_search 2, sexp, s{ q(:defn, atom, _, include(:a)) }
1037
1037
  assert_search 2, sexp, s{ include(:a) }
1038
- assert_search 0, s(:a, s(:b, s(:c))), s{ s(:a, include(:c)) }
1038
+ assert_search 0, s(:a, s(:b, s(:c))), s{ q(:a, include(:c)) }
1039
1039
  end
1040
1040
  end
1041
1041
 
@@ -1045,7 +1045,7 @@ class TestSibling < MatcherTestCase
1045
1045
  end
1046
1046
 
1047
1047
  def matcher
1048
- s{ s(:a) >> s(:b) }
1048
+ s{ q(:a) >> q(:b) }
1049
1049
  end
1050
1050
 
1051
1051
  def inspect_str
@@ -1053,15 +1053,15 @@ class TestSibling < MatcherTestCase
1053
1053
  end
1054
1054
 
1055
1055
  def test_pretty_print_distance
1056
- m = s{ M::Sibling.new(s(:a), s(:b), 3) } # maybe s(:a) << s(:b) << 3 ?
1056
+ m = s{ M::Sibling.new(q(:a), q(:b), 3) } # maybe q(:a) << q(:b) << 3 ?
1057
1057
  assert_pretty_print "sibling(q(:a), q(:b), 3)", m
1058
1058
  end
1059
1059
 
1060
1060
  def test_sibling_satisfy_eh # TODO: possibly remove
1061
- a_a = s{ s(:a) >> s(:a) }
1062
- a_b = s{ s(:a) >> s(:b) }
1063
- a_c = s{ s(:a) >> s(:c) }
1064
- c_a = s{ s(:c) >> s(:a) }
1061
+ a_a = s{ q(:a) >> q(:a) }
1062
+ a_b = s{ q(:a) >> q(:b) }
1063
+ a_c = s{ q(:a) >> q(:c) }
1064
+ c_a = s{ q(:c) >> q(:a) }
1065
1065
 
1066
1066
  assert_satisfy a_b, s(s(:a), s(:b))
1067
1067
  assert_satisfy a_b, s(s(:a), s(:b), s(:c))
@@ -1093,8 +1093,8 @@ class TestMatchCollection < SexpTestCase
1093
1093
  s(:defn, :foo, s(:args), s(:add, :a, :b)),
1094
1094
  s(:defn, :bar, s(:args), s(:sub, :a, :b)))
1095
1095
 
1096
- res = sexp / s{ s(:class, atom, _, ___) } # sexp / pat => MC
1097
- act = res / s{ s(:defn, atom, ___) } # MC / pat => MC
1096
+ res = sexp / s{ q(:class, atom, _, ___) } # sexp / pat => MC
1097
+ act = res / s{ q(:defn, atom, ___) } # MC / pat => MC
1098
1098
 
1099
1099
  _, _, _, defn1, defn2 = sexp
1100
1100
 
@@ -1150,8 +1150,43 @@ class TestSexpSearch < SexpTestCase
1150
1150
  MR.new sexp.deep_clone, hash
1151
1151
  end
1152
1152
 
1153
+ def test_sexp_hash
1154
+ s1 = s(:a)
1155
+ s2 = s(nil)
1156
+ refute_equal s1.hash, s2.hash
1157
+ end
1158
+
1159
+ def test_matcher_inspect
1160
+ pat1 = M.parse "(a [m /b/] (c))"
1161
+
1162
+ assert_equal "q(:a, m(/b/), q(:c))", pat1.inspect
1163
+ end
1164
+
1165
+ def test_matcher_hash
1166
+ a = M::Pattern.new(/x/) # M.parse "[m /x/]"
1167
+ b = M::Atom.new # M.parse "_"
1168
+
1169
+ refute_operator a, :eql?, b
1170
+ refute_equal a.hash, b.hash
1171
+
1172
+ h = {}
1173
+ h[a] = true
1174
+ refute_operator h, :key?, b
1175
+
1176
+ # original problem:
1177
+ a = M.parse "(call nil assert_equal (true) (call _ [m /include./] _))"
1178
+ b = M.parse "(call nil assert_equal (true) (call _ _ _))"
1179
+
1180
+ refute_operator a, :eql?, b
1181
+ refute_equal a.hash, b.hash
1182
+
1183
+ h = {}
1184
+ h[a] = true
1185
+ refute_operator h, :key?, b
1186
+ end
1187
+
1153
1188
  def test_slash_simple
1154
- act = sexp / s{ s(:class, atom, _, ___) }
1189
+ act = sexp / s{ q(:class, atom, _, ___) }
1155
1190
 
1156
1191
  exp = MC.new
1157
1192
  exp << sexp.deep_clone
@@ -1160,7 +1195,7 @@ class TestSexpSearch < SexpTestCase
1160
1195
  end
1161
1196
 
1162
1197
  def test_slash_subsexp
1163
- act = sexp / s{ s(:defn, atom, ___) }
1198
+ act = sexp / s{ q(:defn, atom, ___) }
1164
1199
 
1165
1200
  exp = MC.new
1166
1201
  exp << s(:defn, :foo, s(:args), s(:add, :a, :b))
@@ -1170,7 +1205,7 @@ class TestSexpSearch < SexpTestCase
1170
1205
  end
1171
1206
 
1172
1207
  def test_slash_data
1173
- pat = s{ s(:defn, m(/^test_.+/), ___ ) }
1208
+ pat = s{ q(:defn, m(/^test_.+/), ___ ) }
1174
1209
 
1175
1210
  _, _, (_klass, _, _, _setup, t1, t2, t3) = TestUseCase.sexp.deep_clone
1176
1211
  exp = [t1, t2, t3]
@@ -1199,27 +1234,27 @@ class TestSexpSearch < SexpTestCase
1199
1234
  assert_search 0, sexp, :class # non-pattern should raise
1200
1235
  end
1201
1236
 
1202
- assert_search 0, sexp, s{ s(:class) }
1203
- assert_search 1, sexp, s{ s(:add, :a, :b) }
1204
- assert_search 1, s(:a, s(:b, s(:c))), s{ s(:b, s(:c)) }
1205
- assert_search 0, s(:a, s(:b, s(:c))), s{ s(:a, s(:c)) }
1206
- assert_search 1, sexp, s{ s(:defn, :bar, _, s(:sub, :a, :b)) }
1237
+ assert_search 0, sexp, s{ q(:class) }
1238
+ assert_search 1, sexp, s{ q(:add, :a, :b) }
1239
+ assert_search 1, s(:a, s(:b, s(:c))), s{ q(:b, q(:c)) }
1240
+ assert_search 0, s(:a, s(:b, s(:c))), s{ q(:a, q(:c)) }
1241
+ assert_search 1, sexp, s{ q(:defn, :bar, _, q(:sub, :a, :b)) }
1207
1242
  end
1208
1243
 
1209
1244
  def test_satisfy_eh_any_capture # TODO: remove
1210
1245
  sexp = s(:add, :a, :b)
1211
- assert_satisfy s{ any(s(:add, :a, :b), s(:sub, :a, :b)) }, sexp
1246
+ assert_satisfy s{ any(q(:add, :a, :b), q(:sub, :a, :b)) }, sexp
1212
1247
 
1213
- assert_satisfy s{ any(s(atom, :a, :b), s(:sub, :a, :b)) }, sexp
1248
+ assert_satisfy s{ any(q(atom, :a, :b), q(:sub, :a, :b)) }, sexp
1214
1249
  end
1215
1250
 
1216
1251
  def test_satisfy_eh_all_capture # TODO: remove
1217
1252
  sexp = s(:add, :a, :b)
1218
- assert_satisfy s{ all(s(_, :a, :b), s(atom, :a, :b)) }, sexp
1253
+ assert_satisfy s{ all(q(_, :a, :b), q(atom, :a, :b)) }, sexp
1219
1254
 
1220
- assert_satisfy s{ all(s(_, :a, :b), s(atom, :a, :b)) }, sexp
1255
+ assert_satisfy s{ all(q(_, :a, :b), q(atom, :a, :b)) }, sexp
1221
1256
 
1222
- assert_search 1, sexp, s{ all(s(_, :a, :b), s(atom, :a, :b)) }
1257
+ assert_search 1, sexp, s{ all(q(_, :a, :b), q(atom, :a, :b)) }
1223
1258
  end
1224
1259
  end
1225
1260
 
@@ -1228,15 +1263,15 @@ class TestSexpPath < Minitest::Test
1228
1263
  sexp = s(:a, :b, :c) # s called outside block
1229
1264
 
1230
1265
  assert_instance_of Sexp, s{ sexp.deep_clone }
1231
- assert_instance_of Sexp::Matcher, s{ s(:a, :b, :c) }
1232
- assert_instance_of Sexp::Matcher, s{ s(:a, atom, :c) }
1266
+ assert_instance_of Sexp::Matcher, s{ q(:a, :b, :c) }
1267
+ assert_instance_of Sexp::Matcher, s{ q(:a, atom, :c) }
1233
1268
  end
1234
1269
  end
1235
1270
 
1236
1271
  class TestSexpReplaceSexp < SexpTestCase
1237
1272
  def test_replace_sexp
1238
1273
  sexp = s(:a, s(:b), :c)
1239
- actual = sexp.replace_sexp(s{ s(:b) }) { :b }
1274
+ actual = sexp.replace_sexp(s{ q(:b) }) { :b }
1240
1275
 
1241
1276
  assert_equal s(:a, :b, :c), actual
1242
1277
  end
@@ -1309,7 +1344,7 @@ class TestUseCase < SexpTestCase
1309
1344
  end
1310
1345
 
1311
1346
  def test_finding_classes_and_methods
1312
- res = @sexp / s{ s(:class, atom, ___ ) }
1347
+ res = @sexp / s{ q(:class, atom, ___ ) }
1313
1348
 
1314
1349
  _klass, name, * = res.first
1315
1350
 
@@ -1321,7 +1356,7 @@ class TestUseCase < SexpTestCase
1321
1356
  end
1322
1357
 
1323
1358
  def test_finding_empty_test_methods
1324
- empty_test = s{ s(:defn, m(/^test_.+/), s(:args), s(:nil)) }
1359
+ empty_test = s{ q(:defn, m(/^test_.+/), q(:args), q(:nil)) }
1325
1360
  res = @sexp / empty_test
1326
1361
 
1327
1362
  _, _, (_klass, _, _, _setup, _t1, t2, _t3) = TestUseCase.sexp.deep_clone
@@ -1330,7 +1365,7 @@ class TestUseCase < SexpTestCase
1330
1365
  end
1331
1366
 
1332
1367
  def test_search_each_finding_duplicate_test_names
1333
- pat = s{ s(:defn, m(/^test_.+/), ___ ) }
1368
+ pat = s{ q(:defn, m(/^test_.+/), ___ ) }
1334
1369
  counts = Hash.new { |h, k| h[k] = 0 }
1335
1370
 
1336
1371
  @sexp.search_each pat do |x|
@@ -1343,7 +1378,7 @@ class TestUseCase < SexpTestCase
1343
1378
  end
1344
1379
 
1345
1380
  def test_finding_duplicate_test_names_via_res
1346
- pat = s{ s(:defn, m(/^test_.+/), ___ ) }
1381
+ pat = s{ q(:defn, m(/^test_.+/), ___ ) }
1347
1382
  res = @sexp / pat
1348
1383
  counts = Hash.new { |h, k| h[k] = 0 }
1349
1384
 
@@ -1362,8 +1397,8 @@ class TestUseCase < SexpTestCase
1362
1397
  end
1363
1398
 
1364
1399
  def test_rewriting_colon2s
1365
- colon2 = s{ s(:colon2, s(:const, atom), atom) }
1366
- expected = s{ s(:const, "Minitest::Test") }
1400
+ colon2 = s{ q(:colon2, q(:const, atom), atom) }
1401
+ expected = s{ q(:const, "Minitest::Test") }
1367
1402
 
1368
1403
  new_sexp = @sexp.replace_sexp(colon2) { |r|
1369
1404
  (_, (_, a), b) = r
@@ -1388,46 +1423,46 @@ class TestSexpMatchers < SexpTestCase
1388
1423
  SEXP = s(:class, :X, nil, s(:defn, :x, s(:args)))
1389
1424
 
1390
1425
  def test_match_subset
1391
- assert_match s{ child(s(:a)) }, s(:blah, s(:blah, s(:a)))
1392
- assert_match s{ child(s(:a)) }, s(:a)
1426
+ assert_match s{ child(q(:a)) }, s(:blah, s(:blah, s(:a)))
1427
+ assert_match s{ child(q(:a)) }, s(:a)
1393
1428
  end
1394
1429
 
1395
1430
  def test_match_simple
1396
- assert_match s{ s(:lit, _) }, s(:lit, 42)
1431
+ assert_match s{ q(:lit, _) }, s(:lit, 42)
1397
1432
  end
1398
1433
 
1399
1434
  def test_match_mismatch_type
1400
- refute_match s{ s(:xxx, 42) }, s(:lit, 42)
1435
+ refute_match s{ q(:xxx, 42) }, s(:lit, 42)
1401
1436
  end
1402
1437
 
1403
1438
  def test_match_mismatch_data
1404
- refute_match s{ s(:lit, 24) }, s(:lit, 42)
1439
+ refute_match s{ q(:lit, 24) }, s(:lit, 42)
1405
1440
  end
1406
1441
 
1407
1442
  def test_match_mismatch_length_shorter
1408
- refute_match s{ s(:a, :b) }, s(:a, :b, :c)
1443
+ refute_match s{ q(:a, :b) }, s(:a, :b, :c)
1409
1444
  end
1410
1445
 
1411
1446
  def test_match_mismatch_length_longer
1412
- refute_match s{ s(:a, :b, :c) }, s(:a, :b)
1447
+ refute_match s{ q(:a, :b, :c) }, s(:a, :b)
1413
1448
  end
1414
1449
 
1415
1450
  def test_match_wild
1416
- assert_match s{ s(:class, _, _, _) }, SEXP
1451
+ assert_match s{ q(:class, _, _, _) }, SEXP
1417
1452
  end
1418
1453
 
1419
1454
  def test_match_rest_same_length
1420
- assert_match s{ s(:class, _, _, ___) }, SEXP
1455
+ assert_match s{ q(:class, _, _, ___) }, SEXP
1421
1456
  end
1422
1457
 
1423
1458
  def test_match_rest_diff_length
1424
1459
  skip_if_strict
1425
1460
 
1426
- assert_match s{ s(:class, ___) }, SEXP
1461
+ assert_match s{ q(:class, ___) }, SEXP
1427
1462
  end
1428
1463
 
1429
1464
  def test_match_reversed
1430
- assert_match SEXP, s{ s(:class, _, _, ___) }
1465
+ assert_match SEXP, s{ q(:class, _, _, ___) }
1431
1466
  end
1432
1467
 
1433
1468
  def assert_match_case pat, data
@@ -1440,7 +1475,7 @@ class TestSexpMatchers < SexpTestCase
1440
1475
  end
1441
1476
 
1442
1477
  def test_match_case
1443
- assert_match_case s{ s(:class, _, _, ___) }, SEXP
1478
+ assert_match_case s{ q(:class, _, _, ___) }, SEXP
1444
1479
  end
1445
1480
 
1446
1481
  # NOTE: eqt is =~ (equal-tilde)
@@ -1498,12 +1533,12 @@ class TestSexpMatchers < SexpTestCase
1498
1533
  l_cls = s(:class, :X, nil,
1499
1534
  s(:something_in_between),
1500
1535
  s(:cdecl, :Y, s(:hash, s(:lit, :a), s(:lit, 1))))
1501
- p_cls1 = s{ s(:class, ___) & include(s(:cdecl, _, s(:hash, ___))) }
1502
- p_cls2 = s{ s(:class, _, _, s(:cdecl, _, s(:hash, ___))) }
1536
+ p_cls1 = s{ q(:class, ___) & include(q(:cdecl, _, q(:hash, ___))) }
1537
+ p_cls2 = s{ q(:class, _, _, q(:cdecl, _, q(:hash, ___))) }
1503
1538
 
1504
1539
  x, o = true, false
1505
- TestMatcherDirectMatch = cmt x, x, o, x, l_a, s{ s(:a) }
1506
- TestMatcherSubtree = cmt x, x, o, x, l_abc, s{ s(:c) }
1540
+ TestMatcherDirectMatch = cmt x, x, o, x, l_a, s{ q(:a) }
1541
+ TestMatcherSubtree = cmt x, x, o, x, l_abc, s{ q(:c) }
1507
1542
  TestMatcherSubtreeType = cmt x, x, o, x, l_abc, s{ t(:c) }
1508
1543
  TestMatcherDisparateSubtree = cmt x, x, o, x, l_cls, p_cls1
1509
1544
  TestMatcherDisparateSubtree2 = cmt o, o, o, o, l_cls, p_cls2 # TODO: make pass
@@ -1539,18 +1574,29 @@ class TestSexpMatcherParser < Minitest::Test
1539
1574
  lambda { s(&b) }
1540
1575
  end
1541
1576
 
1577
+ re = /(?-mix:\Aa\Z)|(?-mix:\Ab\Z)|(?-mix:\Ac\Z)/ # [m a b c]
1578
+
1542
1579
  test_parse "nothing", nil, ""
1543
1580
  test_parse "nil", delay{ nil }, "nil"
1544
- test_parse "empty", delay{ s() }, "()"
1545
- test_parse "simple", delay{ s(:a) }, "(a)"
1546
- test_parse "number", delay{ s(:a, 42) }, "(a 42)"
1547
- test_parse "string", delay{ s(:a, "s") }, "(a \"s\")"
1548
- test_parse "compound", delay{ s(:b) }, "(a) (b)"
1549
- test_parse "complex", delay{ s(:a, _, s(:b, :cde), ___) }, "(a _ (b cde) ___)"
1550
- test_parse "type", delay{ s(:a, t(:b)) }, "(a [t b])"
1551
- test_parse "match", delay{ s(:a, m(/b/)) }, "(a [m /b/])"
1552
- test_parse "not_atom", delay{ s(:atom) }, "(atom)"
1581
+ test_parse "empty", delay{ q() }, "()"
1582
+ test_parse "simple", delay{ q(:a) }, "(a)"
1583
+ test_parse "number", delay{ q(:a, 42) }, "(a 42)"
1584
+ test_parse "string", delay{ q(:a, "s") }, "(a \"s\")"
1585
+ test_parse "compound", delay{ q(:b) }, "(a) (b)"
1586
+ test_parse "complex", delay{ q(:a, _, q(:b, :cde), ___) }, "(a _ (b cde) ___)"
1587
+ test_parse "type", delay{ q(:a, t(:b)) }, "(a [t b])"
1588
+ test_parse "match", delay{ q(:a, m(/b/)) }, "(a [m /b/])"
1589
+ test_parse "not_atom", delay{ q(:atom) }, "(atom)"
1553
1590
  test_parse "atom", delay{ atom }, "[atom]"
1591
+ test_parse "match_n", delay{ m(re) }, "[m a b c]"
1592
+ test_parse "ne", delay{ q(:call, _, :!=, _) }, "(call _ != _)"
1593
+ test_parse "eq", delay{ q(:call, _, :==, _) }, "(call _ == _)"
1594
+ test_parse "not", delay{ q(:call, _, :"!") }, "(call _ !)"
1595
+ test_parse "eh", delay{ q(:call, _, :include?, _) }, "(call _ include? _)"
1596
+ test_parse "under", delay{ q(:call, nil, :_, _) }, "(call nil :_ _)"
1597
+ test_parse "sym_nil", delay{ q(:call, nil, :nil, _) }, "(call nil :nil _)"
1598
+ # M::Not.new(M.q(:a)), s{ not?(q(:a)) }
1599
+ test_parse "not?", delay{ not?(m(/^_$/)) }, "[not? [m /^_$/]]"
1554
1600
 
1555
1601
  test_bad_parse "open_sexp", "(a"
1556
1602
  test_bad_parse "closed_sexp", "a)"