| // Copyright (c) 2017, 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/dart/ast/ast.dart'; | |
| import 'package:test/test.dart'; | |
| import 'package:test_reflective_loader/test_reflective_loader.dart'; | |
| import 'context_collection_resolution.dart'; | |
| import 'node_text_expectations.dart'; | |
| main() { | |
| defineReflectiveSuite(() { | |
| defineReflectiveTests(InterpolationStringResolutionTest); | |
| defineReflectiveTests(UpdateNodeTextExpectations); | |
| }); | |
| } | |
| @reflectiveTest | |
| class InterpolationStringResolutionTest extends PubPackageResolutionTest { | |
| void test_contents() async { | |
| var code = r''' | |
| var bar; | |
| var f = "foo$bar"; | |
| '''; | |
| var result = await resolveTestCodeWithDiagnostics(code); | |
| var string = result.findNode.stringInterpolation(r'"foo$bar"'); | |
| expect(string.elements, hasLength(3)); | |
| var foo = string.elements[0] as InterpolationString; | |
| var quoteOffset = code.indexOf('"'); | |
| expect(foo.contents.lexeme, '"foo'); | |
| expect(foo.contents.offset, quoteOffset); | |
| expect(foo.contents.end, quoteOffset + '"foo'.length); | |
| } | |
| void test_contentsOffset() async { | |
| var code = r''' | |
| var bar; | |
| var f = "foo${bar}baz"; | |
| '''; | |
| var result = await resolveTestCodeWithDiagnostics(code); | |
| var string = result.findNode.stringInterpolation(r'"foo${bar}baz"'); | |
| expect(string.elements, hasLength(3)); | |
| var quoteOffset = code.indexOf('"'); | |
| var foo = string.elements[0] as InterpolationString; | |
| expect(foo.contentsOffset, quoteOffset + '"'.length); | |
| expect(foo.contentsEnd, quoteOffset + '"foo'.length); | |
| var bar = string.elements[2] as InterpolationString; | |
| expect(bar.contentsOffset, quoteOffset + r'"foo${bar}'.length); | |
| expect(bar.contentsEnd, quoteOffset + r'"foo${bar}baz'.length); | |
| } | |
| void test_contentsOffset_emptyEnd() async { | |
| var code = r''' | |
| var bar; | |
| var f = "foo${bar}"; | |
| '''; | |
| var result = await resolveTestCodeWithDiagnostics(code); | |
| var string = result.findNode.stringInterpolation(r'"foo${bar}"'); | |
| expect(string.elements, hasLength(3)); | |
| var end = string.elements[2] as InterpolationString; | |
| var endStringOffset = code.indexOf('";'); | |
| expect(end.contentsOffset, endStringOffset); | |
| expect(end.contentsEnd, endStringOffset); | |
| } | |
| void test_contentsOffset_unterminated() async { | |
| var code = r''' | |
| var bar; | |
| var f = "foo${bar} | |
| // deliberately unclosed | |
| ; | |
| '''; | |
| var result = await resolveTestCodeWithDiagnostics(r''' | |
| var bar; | |
| var f = "foo${bar} | |
| // ^ | |
| // [diag.unterminatedStringLiteral] Unterminated string literal. | |
| // deliberately unclosed | |
| ; | |
| '''); | |
| var string = result.findNode.stringInterpolation(r'"foo${bar}'); | |
| expect(string.elements, hasLength(3)); | |
| var end = string.elements[2] as InterpolationString; | |
| var endStringOffset = code.indexOf('}') + 1; | |
| expect(end.contentsOffset, endStringOffset); | |
| expect(end.contentsEnd, endStringOffset); | |
| } | |
| @FailingTest(issue: 'https://github.com/dart-lang/sdk/issues/42634') | |
| void test_contentsOffset_unterminated_wrongQuote() async { | |
| var code = r''' | |
| var bar; | |
| var f = "foo${bar}' | |
| // deliberately closed with wrong quote | |
| ; | |
| '''; | |
| var result = await resolveTestCodeWithDiagnostics(r''' | |
| var bar; | |
| var f = "foo${bar}' | |
| // ^ | |
| // [diag.unterminatedStringLiteral] Unterminated string literal. | |
| // deliberately closed with wrong quote | |
| ; | |
| '''); | |
| var string = result.findNode.stringInterpolation('"foo\${bar}\''); | |
| expect(string.elements, hasLength(3)); | |
| var end = string.elements[2] as InterpolationString; | |
| expect(end.value, "'"); | |
| var endStringOffset = code.indexOf("'") + 1; | |
| expect(end.contentsOffset, endStringOffset); | |
| expect(end.contentsEnd, endStringOffset); | |
| } | |
| void test_value() async { | |
| var code = r''' | |
| var bar; | |
| var f = "foo\n$bar"; | |
| '''; | |
| var result = await resolveTestCodeWithDiagnostics(code); | |
| var string = result.findNode.stringInterpolation(r'"foo\n$bar"'); | |
| expect(string.elements, hasLength(3)); | |
| var foo = string.elements[0] as InterpolationString; | |
| expect(foo.value, "foo\n"); | |
| } | |
| } |