lexer_test.go 3.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155
  1. package glob
  2. import (
  3. "testing"
  4. )
  5. func TestLexGood(t *testing.T) {
  6. for id, test := range []struct {
  7. pattern string
  8. items []item
  9. }{
  10. {
  11. pattern: "hello",
  12. items: []item{
  13. item{item_text, "hello"},
  14. item{item_eof, ""},
  15. },
  16. },
  17. {
  18. pattern: "hello,world",
  19. items: []item{
  20. item{item_text, "hello,world"},
  21. item{item_eof, ""},
  22. },
  23. },
  24. {
  25. pattern: "hello\\,world",
  26. items: []item{
  27. item{item_text, "hello,world"},
  28. item{item_eof, ""},
  29. },
  30. },
  31. {
  32. pattern: "hello\\{world",
  33. items: []item{
  34. item{item_text, "hello{world"},
  35. item{item_eof, ""},
  36. },
  37. },
  38. {
  39. pattern: "hello?",
  40. items: []item{
  41. item{item_text, "hello"},
  42. item{item_single, "?"},
  43. item{item_eof, ""},
  44. },
  45. },
  46. {
  47. pattern: "hellof*",
  48. items: []item{
  49. item{item_text, "hellof"},
  50. item{item_any, "*"},
  51. item{item_eof, ""},
  52. },
  53. },
  54. {
  55. pattern: "hello**",
  56. items: []item{
  57. item{item_text, "hello"},
  58. item{item_super, "**"},
  59. item{item_eof, ""},
  60. },
  61. },
  62. {
  63. pattern: "[日-語]",
  64. items: []item{
  65. item{item_range_open, "["},
  66. item{item_range_lo, "日"},
  67. item{item_range_between, "-"},
  68. item{item_range_hi, "語"},
  69. item{item_range_close, "]"},
  70. item{item_eof, ""},
  71. },
  72. },
  73. {
  74. pattern: "[!日-語]",
  75. items: []item{
  76. item{item_range_open, "["},
  77. item{item_not, "!"},
  78. item{item_range_lo, "日"},
  79. item{item_range_between, "-"},
  80. item{item_range_hi, "語"},
  81. item{item_range_close, "]"},
  82. item{item_eof, ""},
  83. },
  84. },
  85. {
  86. pattern: "[日本語]",
  87. items: []item{
  88. item{item_range_open, "["},
  89. item{item_text, "日本語"},
  90. item{item_range_close, "]"},
  91. item{item_eof, ""},
  92. },
  93. },
  94. {
  95. pattern: "[!日本語]",
  96. items: []item{
  97. item{item_range_open, "["},
  98. item{item_not, "!"},
  99. item{item_text, "日本語"},
  100. item{item_range_close, "]"},
  101. item{item_eof, ""},
  102. },
  103. },
  104. {
  105. pattern: "{a,b}",
  106. items: []item{
  107. item{item_terms_open, "{"},
  108. item{item_text, "a"},
  109. item{item_separator, ","},
  110. item{item_text, "b"},
  111. item{item_terms_close, "}"},
  112. item{item_eof, ""},
  113. },
  114. },
  115. {
  116. pattern: "{[!日-語],*,?,{a,b,\\c}}",
  117. items: []item{
  118. item{item_terms_open, "{"},
  119. item{item_range_open, "["},
  120. item{item_not, "!"},
  121. item{item_range_lo, "日"},
  122. item{item_range_between, "-"},
  123. item{item_range_hi, "語"},
  124. item{item_range_close, "]"},
  125. item{item_separator, ","},
  126. item{item_any, "*"},
  127. item{item_separator, ","},
  128. item{item_single, "?"},
  129. item{item_separator, ","},
  130. item{item_terms_open, "{"},
  131. item{item_text, "a"},
  132. item{item_separator, ","},
  133. item{item_text, "b"},
  134. item{item_separator, ","},
  135. item{item_text, "c"},
  136. item{item_terms_close, "}"},
  137. item{item_terms_close, "}"},
  138. item{item_eof, ""},
  139. },
  140. },
  141. } {
  142. lexer := newLexer(test.pattern)
  143. for i, exp := range test.items {
  144. act := lexer.nextItem()
  145. if act.t != exp.t {
  146. t.Errorf("#%d %q: wrong %d-th item type: exp: %q; act: %q\n\t(%s vs %s)", id, test.pattern, i, exp.t, act.t, exp, act)
  147. }
  148. if act.s != exp.s {
  149. t.Errorf("#%d %q: wrong %d-th item contents: exp: %q; act: %q\n\t(%s vs %s)", id, test.pattern, i, exp.s, act.s, exp, act)
  150. }
  151. }
  152. }
  153. }