const Scanner = require('../../gramjs/extensions/Scanner') const helloScanner = new Scanner('Hello world') describe('Scanner', () => { beforeEach(() => helloScanner.reset()) test('it should construct a new Scanner', () => { expect(helloScanner.str).toEqual('Hello world') expect(helloScanner.pos).toEqual(0) expect(helloScanner.lastMatch).toBeNull() }) describe('.chr', () => { test('it should return the character at the current pos', () => { expect(helloScanner.chr).toEqual('H') }) }) describe('.peek', () => { test('it should return the character at the current pos', () => { expect(helloScanner.peek()).toEqual('H') }) test('it should return the next n characters', () => { expect(helloScanner.peek(3)).toEqual('Hel') expect(helloScanner.peek(5)).toEqual('Hello') }) }) describe('.consume', () => { test('it should consume the current character', () => { const char = helloScanner.consume() expect(char).toEqual('H') expect(helloScanner.pos).toEqual(1) }) test('it should consume the next n characters', () => { const chars = helloScanner.consume(5) expect(chars).toEqual('Hello') expect(helloScanner.pos).toEqual(5) }) }) describe('.reverse', () => { test('it should set pos back n characters', () => { helloScanner.consume(5) helloScanner.reverse(5) expect(helloScanner.pos).toEqual(0) }) test('it should not go back further than 0', () => { helloScanner.reverse(10) expect(helloScanner.pos).toEqual(0) }) }) describe('.scanUntil', () => { test('it should scan the string for a regular expression starting at the current pos', () => { helloScanner.scanUntil(/w/) expect(helloScanner.pos).toEqual(6) }) test('it should do nothing if the pattern is not found', () => { helloScanner.scanUntil(/G/) expect(helloScanner.pos).toEqual(0) }) }) describe('.rest', () => { test('it should return the unconsumed input', () => { helloScanner.consume(6) expect(helloScanner.rest).toEqual('world') }) }) describe('.reset', () => { test('it should reset the pos to 0', () => { helloScanner.consume(5) helloScanner.reset() expect(helloScanner.pos).toEqual(0) }) }) describe('.eof', () => { test('it should return true if the scanner has reached the end of the input', () => { expect(helloScanner.eof()).toBe(false) helloScanner.consume(11) expect(helloScanner.eof()).toBe(true) }) }) describe('.bof', () => { test('it should return true if pos is 0', () => { expect(helloScanner.bof()).toBe(true) helloScanner.consume(11) expect(helloScanner.bof()).toBe(false) }) }) })