| Index: test/util/string_literal_iterator_test.dart
|
| diff --git a/test/util/string_literal_iterator_test.dart b/test/util/string_literal_iterator_test.dart
|
| new file mode 100644
|
| index 0000000000000000000000000000000000000000..bd4b56e9ba80abeb5dd6829a4f04fe19ef0a64a9
|
| --- /dev/null
|
| +++ b/test/util/string_literal_iterator_test.dart
|
| @@ -0,0 +1,243 @@
|
| +// Copyright (c) 2015, 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:analyzer/analyzer.dart';
|
| +import 'package:unittest/unittest.dart';
|
| +import 'package:unittest/src/util/string_literal_iterator.dart';
|
| +
|
| +final _offset = "final str = ".length;
|
| +
|
| +void main() {
|
| + group("returns simple characters in", () {
|
| + test("a single simple string", () {
|
| + var iter = _parse('"abc"');
|
| +
|
| + expect(iter.current, isNull);
|
| + expect(iter.offset, equals(_offset));
|
| +
|
| + expect(iter.moveNext(), isTrue);
|
| + expect(iter.current, _isRune("a"));
|
| + expect(iter.offset, equals(_offset + 1));
|
| +
|
| + expect(iter.moveNext(), isTrue);
|
| + expect(iter.current, _isRune("b"));
|
| + expect(iter.offset, equals(_offset + 2));
|
| +
|
| + expect(iter.moveNext(), isTrue);
|
| + expect(iter.current, _isRune("c"));
|
| + expect(iter.offset, equals(_offset + 3));
|
| +
|
| + expect(iter.moveNext(), isFalse);
|
| + expect(iter.current, isNull);
|
| + expect(iter.offset, equals(_offset + 4));
|
| + });
|
| +
|
| + test("a raw string", () {
|
| + var iter = _parse('r"abc"');
|
| +
|
| + expect(iter.current, isNull);
|
| + expect(iter.offset, equals(_offset + 1));
|
| +
|
| + expect(iter.moveNext(), isTrue);
|
| + expect(iter.current, _isRune("a"));
|
| + expect(iter.offset, equals(_offset + 2));
|
| +
|
| + expect(iter.moveNext(), isTrue);
|
| + expect(iter.current, _isRune("b"));
|
| + expect(iter.offset, equals(_offset + 3));
|
| +
|
| + expect(iter.moveNext(), isTrue);
|
| + expect(iter.current, _isRune("c"));
|
| + expect(iter.offset, equals(_offset + 4));
|
| +
|
| + expect(iter.moveNext(), isFalse);
|
| + expect(iter.current, isNull);
|
| + expect(iter.offset, equals(_offset + 5));
|
| + });
|
| +
|
| + test("a multiline string", () {
|
| + var iter = _parse('"""ab\ncd"""');
|
| +
|
| + expect(iter.current, isNull);
|
| + expect(iter.offset, equals(_offset + 2));
|
| +
|
| + expect(iter.moveNext(), isTrue);
|
| + expect(iter.current, _isRune("a"));
|
| + expect(iter.offset, equals(_offset + 3));
|
| +
|
| + expect(iter.moveNext(), isTrue);
|
| + expect(iter.current, _isRune("b"));
|
| + expect(iter.offset, equals(_offset + 4));
|
| +
|
| + expect(iter.moveNext(), isTrue);
|
| + expect(iter.current, _isRune("\n"));
|
| + expect(iter.offset, equals(_offset + 5));
|
| +
|
| + expect(iter.moveNext(), isTrue);
|
| + expect(iter.current, _isRune("c"));
|
| + expect(iter.offset, equals(_offset + 6));
|
| +
|
| + expect(iter.moveNext(), isTrue);
|
| + expect(iter.current, _isRune("d"));
|
| + expect(iter.offset, equals(_offset + 7));
|
| +
|
| + expect(iter.moveNext(), isFalse);
|
| + expect(iter.current, isNull);
|
| + expect(iter.offset, equals(_offset + 8));
|
| + });
|
| +
|
| + test("a raw multiline string", () {
|
| + var iter = _parse('r"""ab\ncd"""');
|
| +
|
| + expect(iter.current, isNull);
|
| + expect(iter.offset, equals(_offset + 3));
|
| +
|
| + expect(iter.moveNext(), isTrue);
|
| + expect(iter.current, _isRune("a"));
|
| + expect(iter.offset, equals(_offset + 4));
|
| +
|
| + expect(iter.moveNext(), isTrue);
|
| + expect(iter.current, _isRune("b"));
|
| + expect(iter.offset, equals(_offset + 5));
|
| +
|
| + expect(iter.moveNext(), isTrue);
|
| + expect(iter.current, _isRune("\n"));
|
| + expect(iter.offset, equals(_offset + 6));
|
| +
|
| + expect(iter.moveNext(), isTrue);
|
| + expect(iter.current, _isRune("c"));
|
| + expect(iter.offset, equals(_offset + 7));
|
| +
|
| + expect(iter.moveNext(), isTrue);
|
| + expect(iter.current, _isRune("d"));
|
| + expect(iter.offset, equals(_offset + 8));
|
| +
|
| + expect(iter.moveNext(), isFalse);
|
| + expect(iter.current, isNull);
|
| + expect(iter.offset, equals(_offset + 9));
|
| + });
|
| +
|
| + test("adjacent strings", () {
|
| + var iter = _parse('"ab" r"cd" """ef\ngh"""');
|
| +
|
| + expect(iter.current, isNull);
|
| + expect(iter.offset, equals(_offset));
|
| +
|
| + expect(iter.moveNext(), isTrue);
|
| + expect(iter.current, _isRune("a"));
|
| + expect(iter.offset, equals(_offset + 1));
|
| +
|
| + expect(iter.moveNext(), isTrue);
|
| + expect(iter.current, _isRune("b"));
|
| + expect(iter.offset, equals(_offset + 2));
|
| +
|
| + expect(iter.moveNext(), isTrue);
|
| + expect(iter.current, _isRune("c"));
|
| + expect(iter.offset, equals(_offset + 7));
|
| +
|
| + expect(iter.moveNext(), isTrue);
|
| + expect(iter.current, _isRune("d"));
|
| + expect(iter.offset, equals(_offset + 8));
|
| +
|
| + expect(iter.moveNext(), isTrue);
|
| + expect(iter.current, _isRune("e"));
|
| + expect(iter.offset, equals(_offset + 14));
|
| +
|
| + expect(iter.moveNext(), isTrue);
|
| + expect(iter.current, _isRune("f"));
|
| + expect(iter.offset, equals(_offset + 15));
|
| +
|
| + expect(iter.moveNext(), isTrue);
|
| + expect(iter.current, _isRune("\n"));
|
| + expect(iter.offset, equals(_offset + 16));
|
| +
|
| + expect(iter.moveNext(), isTrue);
|
| + expect(iter.current, _isRune("g"));
|
| + expect(iter.offset, equals(_offset + 17));
|
| +
|
| + expect(iter.moveNext(), isTrue);
|
| + expect(iter.current, _isRune("h"));
|
| + expect(iter.offset, equals(_offset + 18));
|
| +
|
| + expect(iter.moveNext(), isFalse);
|
| + expect(iter.current, isNull);
|
| + expect(iter.offset, equals(_offset + 19));
|
| + });
|
| + });
|
| +
|
| + group("parses an escape sequence for", () {
|
| + test("a newline", () => _expectEscape(r"\n", "\n"));
|
| + test("a carriage return", () => _expectEscape(r"\r", "\r"));
|
| + test("a form feed", () => _expectEscape(r"\f", "\f"));
|
| + test("a backspace", () => _expectEscape(r"\b", "\b"));
|
| + test("a tab", () => _expectEscape(r"\t", "\t"));
|
| + test("a vertical tab", () => _expectEscape(r"\v", "\v"));
|
| + test("a quote", () => _expectEscape(r'\"', '"'));
|
| + test("a backslash", () => _expectEscape(r"\\", "\\"));
|
| +
|
| + test("a hex character", () {
|
| + _expectEscape(r"\x62", "b");
|
| + _expectEscape(r"\x7A", "z");
|
| + _expectEscape(r"\x7a", "z");
|
| + });
|
| +
|
| + test("a fixed-length unicode character",
|
| + () => _expectEscape(r"\u0062", "b"));
|
| +
|
| + test("a short variable-length unicode character",
|
| + () => _expectEscape(r"\u{62}", "b"));
|
| +
|
| + test("a long variable-length unicode character",
|
| + () => _expectEscape(r"\u{000062}", "b"));
|
| + });
|
| +
|
| + group("throws an ArgumentError for", () {
|
| + test("interpolation", () {
|
| + expect(() => _parse(r'"$foo"'), throwsArgumentError);
|
| + });
|
| +
|
| + test("interpolation in an adjacent string", () {
|
| + expect(() => _parse(r'"foo" "$bar" "baz"'), throwsArgumentError);
|
| + });
|
| + });
|
| +}
|
| +
|
| +/// Asserts that [escape] is parsed as [value].
|
| +void _expectEscape(String escape, String value) {
|
| + var iter = _parse('"a${escape}b"');
|
| +
|
| + expect(iter.current, isNull);
|
| + expect(iter.offset, equals(_offset));
|
| +
|
| + expect(iter.moveNext(), isTrue);
|
| + expect(iter.current, _isRune("a"));
|
| + expect(iter.offset, equals(_offset + 1));
|
| +
|
| + expect(iter.moveNext(), isTrue);
|
| + expect(iter.current, _isRune(value));
|
| + expect(iter.offset, equals(_offset + 2));
|
| +
|
| + expect(iter.moveNext(), isTrue);
|
| + expect(iter.current, _isRune("b"));
|
| + expect(iter.offset, equals(_offset + escape.length + 2));
|
| +
|
| + expect(iter.moveNext(), isFalse);
|
| + expect(iter.current, isNull);
|
| + expect(iter.offset, equals(_offset + escape.length + 3));
|
| +}
|
| +
|
| +/// Returns a matcher that asserts that the given rune is the rune for [char].
|
| +Matcher _isRune(String char) {
|
| + return predicate((rune) {
|
| + return rune is int && new String.fromCharCode(rune) == char;
|
| + }, 'is the rune "$char"');
|
| +}
|
| +
|
| +/// Parses [dart], which should be a string literal, into a
|
| +/// [StringLiteralIterator].
|
| +StringLiteralIterator _parse(String dart) {
|
| + var literal = parseCompilationUnit("final str = $dart;")
|
| + .declarations.single.variables.variables.single.initializer;
|
| + return new StringLiteralIterator(literal);
|
| +}
|
|
|