...

Source file src/github.com/PaesslerAG/gval/parser_test.go

Documentation: github.com/PaesslerAG/gval

     1  package gval
     2  
     3  import (
     4  	"testing"
     5  	"text/scanner"
     6  	"unicode"
     7  )
     8  
     9  func TestParser_Scan(t *testing.T) {
    10  	tests := []struct {
    11  		name  string
    12  		input string
    13  		Language
    14  		do        func(p *Parser)
    15  		wantScan  rune
    16  		wantToken string
    17  		wantPanic bool
    18  	}{
    19  		{
    20  			name:  "camouflage",
    21  			input: "$abc",
    22  			do: func(p *Parser) {
    23  				p.Scan()
    24  				p.Camouflage("test")
    25  			},
    26  			wantScan:  '$',
    27  			wantToken: "$",
    28  		},
    29  		{
    30  			name:  "camouflage with next",
    31  			input: "$abc",
    32  			do: func(p *Parser) {
    33  				p.Scan()
    34  				p.Camouflage("test")
    35  				p.Next()
    36  			},
    37  			wantPanic: true,
    38  		},
    39  		{
    40  			name:  "camouflage scan camouflage",
    41  			input: "$abc",
    42  			do: func(p *Parser) {
    43  				p.Scan()
    44  				p.Camouflage("test")
    45  				p.Scan()
    46  				p.Camouflage("test2")
    47  			},
    48  			wantScan:  '$',
    49  			wantToken: "$",
    50  		},
    51  		{
    52  			name:  "camouflage with peek",
    53  			input: "$abc",
    54  			do: func(p *Parser) {
    55  				p.Scan()
    56  				p.Camouflage("test")
    57  				p.Peek()
    58  			},
    59  			wantPanic: true,
    60  		},
    61  		{
    62  			name:  "next and peek",
    63  			input: "$#abc",
    64  			do: func(p *Parser) {
    65  				p.Scan()
    66  				p.Next()
    67  				p.Peek()
    68  			},
    69  			wantScan:  scanner.Ident,
    70  			wantToken: "abc",
    71  		},
    72  		{
    73  			name:  "scan token camouflage token",
    74  			input: "abc",
    75  			do: func(p *Parser) {
    76  				p.Scan()
    77  				p.TokenText()
    78  				p.Camouflage("test")
    79  			},
    80  			wantScan:  scanner.Ident,
    81  			wantToken: "abc",
    82  		},
    83  		{
    84  			name:  "scan token peek camouflage token",
    85  			input: "abc",
    86  			do: func(p *Parser) {
    87  				p.Scan()
    88  				p.TokenText()
    89  				p.Peek()
    90  				p.Camouflage("test")
    91  			},
    92  			wantScan:  scanner.Ident,
    93  			wantToken: "abc",
    94  		},
    95  		{
    96  			name:  "tokenize all whitespace",
    97  			input: "foo\tbar\nbaz",
    98  			do: func(p *Parser) {
    99  				p.SetWhitespace()
   100  				p.Scan()
   101  			},
   102  			wantScan:  '\t',
   103  			wantToken: "\t",
   104  		},
   105  		{
   106  			name:  "custom ident",
   107  			input: "$#foo",
   108  			do: func(p *Parser) {
   109  				p.SetIsIdentRuneFunc(func(ch rune, i int) bool { return unicode.IsLetter(ch) || ch == '#' })
   110  				p.Scan()
   111  			},
   112  			wantScan:  scanner.Ident,
   113  			wantToken: "#foo",
   114  		},
   115  		{
   116  			name:  "do not scan idents",
   117  			input: "abc",
   118  			do: func(p *Parser) {
   119  				p.SetMode(scanner.GoTokens ^ scanner.ScanIdents)
   120  				p.Scan()
   121  			},
   122  			wantScan:  'b',
   123  			wantToken: "b",
   124  		},
   125  	}
   126  	for _, tt := range tests {
   127  		t.Run(tt.name, func(t *testing.T) {
   128  			defer func() {
   129  				err := recover()
   130  				if err != nil && !tt.wantPanic {
   131  					t.Fatalf("unexpected panic: %v", err)
   132  				}
   133  			}()
   134  
   135  			p := newParser(tt.input, tt.Language)
   136  			tt.do(p)
   137  			if tt.wantPanic {
   138  				return
   139  			}
   140  			scan := p.Scan()
   141  			token := p.TokenText()
   142  
   143  			if scan != tt.wantScan || token != tt.wantToken {
   144  				t.Errorf("Parser.Scan() = %v (%v), want %v (%v)", scan, token, tt.wantScan, tt.wantToken)
   145  			}
   146  		})
   147  	}
   148  }
   149  

View as plain text