// 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:analyzer/dart/element/element.dart'; import 'package:analyzer/error/error.dart'; import 'package:analyzer/src/dart/ast/element_locator.dart'; import 'package:analyzer/src/dart/ast/utilities.dart'; import 'package:analyzer/src/dart/error/hint_codes.dart'; import 'package:analyzer/src/generated/java_engine.dart'; import 'package:analyzer/src/test_utilities/find_element.dart'; import 'package:analyzer/src/test_utilities/find_node.dart'; import 'package:test/test.dart'; import 'abstract_context.dart'; class AbstractSingleUnitTest extends AbstractContextTest { bool verifyNoTestUnitErrors = true; late String testCode; late String testFile; late CompilationUnit testUnit; late FindNode findNode; late FindElement findElement; void addTestSource(String code) { testCode = code; addSource(testFile, code); } int findEnd(String search) { return findOffset(search) + search.length; } /// Returns the [SimpleIdentifier] at the given search pattern. SimpleIdentifier findIdentifier(String search) { return findNodeAtString(search, (node) => node is SimpleIdentifier) as SimpleIdentifier; } AstNode? findNodeAtOffset(int offset, [Predicate? predicate]) { var result = NodeLocator(offset).searchWithin(testUnit); if (result != null && predicate != null) { result = result.thisOrAncestorMatching(predicate); } return result; } AstNode? findNodeAtString(String search, [Predicate? predicate]) { var offset = findOffset(search); return findNodeAtOffset(offset, predicate); } Element? findNodeElementAtString(String search, [Predicate? predicate]) { var node = findNodeAtString(search, predicate); if (node == null) { return null; } return ElementLocator.locate(node); } int findOffset(String search) { var offset = testCode.indexOf(search); expect(offset, isNonNegative, reason: "Not found '$search' in\n$testCode"); return offset; } int getLeadingIdentifierLength(String search) { var length = 0; while (length < search.length) { var c = search.codeUnitAt(length); if (c >= 'a'.codeUnitAt(0) && c <= 'z'.codeUnitAt(0)) { length++; continue; } if (c >= 'A'.codeUnitAt(0) && c <= 'Z'.codeUnitAt(0)) { length++; continue; } if (c >= '0'.codeUnitAt(0) && c <= '9'.codeUnitAt(0)) { length++; continue; } break; } return length; } Future resolveTestCode(String code) async { addTestSource(code); await resolveTestFile(); } Future resolveTestFile() async { var result = await resolveFile(testFile); testCode = result.content!; testUnit = result.unit!; if (verifyNoTestUnitErrors) { expect(result.errors.where((AnalysisError error) { return error.errorCode != HintCode.DEAD_CODE && error.errorCode != HintCode.UNUSED_CATCH_CLAUSE && error.errorCode != HintCode.UNUSED_CATCH_STACK && error.errorCode != HintCode.UNUSED_ELEMENT && error.errorCode != HintCode.UNUSED_FIELD && error.errorCode != HintCode.UNUSED_IMPORT && error.errorCode != HintCode.UNUSED_LOCAL_VARIABLE; }), isEmpty); } findNode = FindNode(testCode, testUnit); findElement = FindElement(testUnit); } @override void setUp() { super.setUp(); testFile = convertPath('$testPackageRootPath/test.dart'); } }