blob: a3deff1b72db33724b5507d219abd5efbec46fe1 [file] [log] [blame]
// Copyright (c) 2014, the Dart project authors. Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.
import 'package:string_scanner/src/charcode.dart';
import 'package:string_scanner/string_scanner.dart';
import 'package:test/test.dart';
void main() {
late LineScanner scanner;
setUp(() {
scanner = LineScanner('foo\nbar\r\nbaz');
});
test('begins with line and column 0', () {
expect(scanner.line, equals(0));
expect(scanner.column, equals(0));
});
group('scan()', () {
test('consuming no newlines increases the column but not the line', () {
scanner.scan('foo');
expect(scanner.line, equals(0));
expect(scanner.column, equals(3));
});
test('consuming a newline resets the column and increases the line', () {
scanner.expect('foo\nba');
expect(scanner.line, equals(1));
expect(scanner.column, equals(2));
});
test('consuming multiple newlines resets the column and increases the line',
() {
scanner.expect('foo\nbar\r\nb');
expect(scanner.line, equals(2));
expect(scanner.column, equals(1));
});
test("consuming halfway through a CR LF doesn't count as a line", () {
scanner.expect('foo\nbar\r');
expect(scanner.line, equals(1));
expect(scanner.column, equals(4));
scanner.expect('\nb');
expect(scanner.line, equals(2));
expect(scanner.column, equals(1));
});
});
group('readChar()', () {
test('on a non-newline character increases the column but not the line',
() {
scanner.readChar();
expect(scanner.line, equals(0));
expect(scanner.column, equals(1));
});
test('consuming a newline resets the column and increases the line', () {
scanner.expect('foo');
expect(scanner.line, equals(0));
expect(scanner.column, equals(3));
scanner.readChar();
expect(scanner.line, equals(1));
expect(scanner.column, equals(0));
});
test("consuming halfway through a CR LF doesn't count as a line", () {
scanner.expect('foo\nbar');
expect(scanner.line, equals(1));
expect(scanner.column, equals(3));
scanner.readChar();
expect(scanner.line, equals(1));
expect(scanner.column, equals(4));
scanner.readChar();
expect(scanner.line, equals(2));
expect(scanner.column, equals(0));
});
});
group('scanChar()', () {
test('on a non-newline character increases the column but not the line',
() {
scanner.scanChar($f);
expect(scanner.line, equals(0));
expect(scanner.column, equals(1));
});
test('consuming a newline resets the column and increases the line', () {
scanner.expect('foo');
expect(scanner.line, equals(0));
expect(scanner.column, equals(3));
scanner.scanChar($lf);
expect(scanner.line, equals(1));
expect(scanner.column, equals(0));
});
test("consuming halfway through a CR LF doesn't count as a line", () {
scanner.expect('foo\nbar');
expect(scanner.line, equals(1));
expect(scanner.column, equals(3));
scanner.scanChar($cr);
expect(scanner.line, equals(1));
expect(scanner.column, equals(4));
scanner.scanChar($lf);
expect(scanner.line, equals(2));
expect(scanner.column, equals(0));
});
});
group('position=', () {
test('forward through newlines sets the line and column', () {
scanner.position = 10; // "foo\nbar\r\nb"
expect(scanner.line, equals(2));
expect(scanner.column, equals(1));
});
test('forward through no newlines sets the column', () {
scanner.position = 2; // "fo"
expect(scanner.line, equals(0));
expect(scanner.column, equals(2));
});
test('backward through newlines sets the line and column', () {
scanner.scan('foo\nbar\r\nbaz');
scanner.position = 2; // "fo"
expect(scanner.line, equals(0));
expect(scanner.column, equals(2));
});
test('backward through no newlines sets the column', () {
scanner.scan('foo\nbar\r\nbaz');
scanner.position = 10; // "foo\nbar\r\nb"
expect(scanner.line, equals(2));
expect(scanner.column, equals(1));
});
test("forward halfway through a CR LF doesn't count as a line", () {
scanner.position = 8; // "foo\nbar\r"
expect(scanner.line, equals(1));
expect(scanner.column, equals(4));
});
});
test('state= restores the line, column, and position', () {
scanner.scan('foo\nb');
final state = scanner.state;
scanner.scan('ar\nba');
scanner.state = state;
expect(scanner.rest, equals('ar\r\nbaz'));
expect(scanner.line, equals(1));
expect(scanner.column, equals(1));
});
test('state= rejects a foreign state', () {
scanner.scan('foo\nb');
expect(() => LineScanner(scanner.string).state = scanner.state,
throwsArgumentError);
});
}