lexer_test.go 3.4 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091
  1. package buffer // import "github.com/tdewolff/parse/buffer"
  2. import (
  3. "bytes"
  4. "io"
  5. "testing"
  6. "github.com/tdewolff/test"
  7. )
  8. func TestLexer(t *testing.T) {
  9. s := `Lorem ipsum dolor sit amet, consectetur adipiscing elit.`
  10. z := NewLexer(bytes.NewBufferString(s))
  11. test.T(t, z.err, nil, "buffer has no error")
  12. test.T(t, z.Err(), nil, "buffer is at EOF but must not return EOF until we reach that")
  13. test.That(t, z.Pos() == 0, "buffer must start at position 0")
  14. test.That(t, z.Peek(0) == 'L', "first character must be 'L'")
  15. test.That(t, z.Peek(1) == 'o', "second character must be 'o'")
  16. z.Move(1)
  17. test.That(t, z.Peek(0) == 'o', "must be 'o' at position 1")
  18. test.That(t, z.Peek(1) == 'r', "must be 'r' at position 1")
  19. z.Rewind(6)
  20. test.That(t, z.Peek(0) == 'i', "must be 'i' at position 6")
  21. test.That(t, z.Peek(1) == 'p', "must be 'p' at position 7")
  22. test.Bytes(t, z.Lexeme(), []byte("Lorem "), "buffered string must now read 'Lorem ' when at position 6")
  23. test.Bytes(t, z.Shift(), []byte("Lorem "), "shift must return the buffered string")
  24. test.That(t, z.Pos() == 0, "after shifting position must be 0")
  25. test.That(t, z.Peek(0) == 'i', "must be 'i' at position 0 after shifting")
  26. test.That(t, z.Peek(1) == 'p', "must be 'p' at position 1 after shifting")
  27. test.T(t, z.Err(), nil, "error must be nil at this point")
  28. z.Move(len(s) - len("Lorem ") - 1)
  29. test.T(t, z.Err(), nil, "error must be nil just before the end of the buffer")
  30. z.Skip()
  31. test.That(t, z.Pos() == 0, "after skipping position must be 0")
  32. z.Move(1)
  33. test.T(t, z.Err(), io.EOF, "error must be EOF when past the buffer")
  34. z.Move(-1)
  35. test.T(t, z.Err(), nil, "error must be nil just before the end of the buffer, even when it has been past the buffer")
  36. }
  37. func TestLexerRunes(t *testing.T) {
  38. z := NewLexer(bytes.NewBufferString("aæ†\U00100000"))
  39. r, n := z.PeekRune(0)
  40. test.That(t, n == 1, "first character must be length 1")
  41. test.That(t, r == 'a', "first character must be rune 'a'")
  42. r, n = z.PeekRune(1)
  43. test.That(t, n == 2, "second character must be length 2")
  44. test.That(t, r == 'æ', "second character must be rune 'æ'")
  45. r, n = z.PeekRune(3)
  46. test.That(t, n == 3, "fourth character must be length 3")
  47. test.That(t, r == '†', "fourth character must be rune '†'")
  48. r, n = z.PeekRune(6)
  49. test.That(t, n == 4, "seventh character must be length 4")
  50. test.That(t, r == '\U00100000', "seventh character must be rune '\U00100000'")
  51. }
  52. func TestLexerBadRune(t *testing.T) {
  53. z := NewLexer(bytes.NewBufferString("\xF0")) // expect four byte rune
  54. r, n := z.PeekRune(0)
  55. test.T(t, n, 1, "length")
  56. test.T(t, r, rune(0xF0), "rune")
  57. }
  58. func TestLexerZeroLen(t *testing.T) {
  59. z := NewLexer(test.NewPlainReader(bytes.NewBufferString("")))
  60. test.That(t, z.Peek(0) == 0, "first character must yield error")
  61. }
  62. func TestLexerEmptyReader(t *testing.T) {
  63. z := NewLexer(test.NewEmptyReader())
  64. test.That(t, z.Peek(0) == 0, "first character must yield error")
  65. test.T(t, z.Err(), io.EOF, "error must be EOF")
  66. test.That(t, z.Peek(0) == 0, "second peek must also yield error")
  67. }
  68. func TestLexerErrorReader(t *testing.T) {
  69. z := NewLexer(test.NewErrorReader(0))
  70. test.That(t, z.Peek(0) == 0, "first character must yield error")
  71. test.T(t, z.Err(), test.ErrPlain, "error must be ErrPlain")
  72. test.That(t, z.Peek(0) == 0, "second peek must also yield error")
  73. }
  74. func TestLexerBytes(t *testing.T) {
  75. b := []byte{'t', 'e', 's', 't'}
  76. z := NewLexerBytes(b)
  77. test.That(t, z.Peek(4) == 0, "fifth character must yield NULL")
  78. }