github.1485827954.workers.dev/ethereum/go-ethereum@v1.14.3/core/asm/lex_test.go (about) 1 // Copyright 2017 The go-ethereum Authors 2 // This file is part of the go-ethereum library. 3 // 4 // The go-ethereum library is free software: you can redistribute it and/or modify 5 // it under the terms of the GNU Lesser General Public License as published by 6 // the Free Software Foundation, either version 3 of the License, or 7 // (at your option) any later version. 8 // 9 // The go-ethereum library is distributed in the hope that it will be useful, 10 // but WITHOUT ANY WARRANTY; without even the implied warranty of 11 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 12 // GNU Lesser General Public License for more details. 13 // 14 // You should have received a copy of the GNU Lesser General Public License 15 // along with the go-ethereum library. If not, see <http://www.gnu.org/licenses/>. 16 17 package asm 18 19 import ( 20 "reflect" 21 "testing" 22 ) 23 24 func lexAll(src string) []token { 25 ch := Lex([]byte(src), false) 26 27 var tokens []token 28 for i := range ch { 29 tokens = append(tokens, i) 30 } 31 return tokens 32 } 33 34 func TestLexer(t *testing.T) { 35 tests := []struct { 36 input string 37 tokens []token 38 }{ 39 { 40 input: ";; this is a comment", 41 tokens: []token{{typ: lineStart}, {typ: eof}}, 42 }, 43 { 44 input: "0x12345678", 45 tokens: []token{{typ: lineStart}, {typ: number, text: "0x12345678"}, {typ: eof}}, 46 }, 47 { 48 input: "0x123ggg", 49 tokens: []token{{typ: lineStart}, {typ: number, text: "0x123"}, {typ: element, text: "ggg"}, {typ: eof}}, 50 }, 51 { 52 input: "12345678", 53 tokens: []token{{typ: lineStart}, {typ: number, text: "12345678"}, {typ: eof}}, 54 }, 55 { 56 input: "123abc", 57 tokens: []token{{typ: lineStart}, {typ: number, text: "123"}, {typ: element, text: "abc"}, {typ: eof}}, 58 }, 59 { 60 input: "0123abc", 61 tokens: []token{{typ: lineStart}, {typ: number, text: "0123"}, {typ: element, text: "abc"}, {typ: eof}}, 62 }, 63 { 64 input: "00123abc", 65 tokens: []token{{typ: lineStart}, {typ: number, text: "00123"}, {typ: element, text: "abc"}, {typ: eof}}, 66 }, 67 { 68 input: "@foo", 69 tokens: []token{{typ: lineStart}, {typ: label, text: "foo"}, {typ: eof}}, 70 }, 71 { 72 input: "@label123", 73 tokens: []token{{typ: lineStart}, {typ: label, text: "label123"}, {typ: eof}}, 74 }, 75 // Comment after label 76 { 77 input: "@label123 ;; comment", 78 tokens: []token{{typ: lineStart}, {typ: label, text: "label123"}, {typ: eof}}, 79 }, 80 // Comment after instruction 81 { 82 input: "push 3 ;; comment\nadd", 83 tokens: []token{{typ: lineStart}, {typ: element, text: "push"}, {typ: number, text: "3"}, {typ: lineEnd, text: "\n"}, {typ: lineStart, lineno: 1}, {typ: element, lineno: 1, text: "add"}, {typ: eof, lineno: 1}}, 84 }, 85 } 86 87 for _, test := range tests { 88 tokens := lexAll(test.input) 89 if !reflect.DeepEqual(tokens, test.tokens) { 90 t.Errorf("input %q\ngot: %+v\nwant: %+v", test.input, tokens, test.tokens) 91 } 92 } 93 }