Index: packages/string_scanner/test/line_scanner_test.dart |
diff --git a/packages/string_scanner/test/line_scanner_test.dart b/packages/string_scanner/test/line_scanner_test.dart |
new file mode 100644 |
index 0000000000000000000000000000000000000000..68e5c38143b35e5ec265b55edc390dba6bf1603b |
--- /dev/null |
+++ b/packages/string_scanner/test/line_scanner_test.dart |
@@ -0,0 +1,136 @@ |
+// 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. |
+ |
+library string_scanner.line_scanner_test; |
+ |
+import 'package:string_scanner/string_scanner.dart'; |
+import 'package:test/test.dart'; |
+ |
+void main() { |
+ var scanner; |
+ setUp(() { |
+ scanner = new 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("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'); |
+ var 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(() => new LineScanner(scanner.string).state = scanner.state, |
+ throwsArgumentError); |
+ }); |
+} |