// Copyright (c) 2022, 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:_macros/src/api.dart'; import 'package:_macros/src/executor.dart'; import 'package:_macros/src/executor/remote_instance.dart'; import 'package:_macros/src/executor/response_impls.dart'; import 'package:test/fake.dart'; import 'package:test/test.dart'; void main() { group('MacroInstanceIdentifierImpl', () { test('shouldExecute', () { for (var kind in DeclarationKind.values) { for (var phase in Phase.values) { var instance = instancesByKindAndPhase[kind]?[phase]; if (instance == null) continue; for (var otherKind in DeclarationKind.values) { for (var otherPhase in Phase.values) { var expected = false; if (otherPhase == phase) { if (kind == otherKind) { expected = true; } else if (kind == DeclarationKind.function && otherKind == DeclarationKind.method) { expected = true; } else if (kind == DeclarationKind.variable && otherKind == DeclarationKind.field) { expected = true; } } expect(instance.shouldExecute(otherKind, otherPhase), expected, reason: 'Expected a $kind macro in $phase to ' '${expected ? '' : 'not '}be applied to a $otherKind ' 'in $otherPhase'); } } } } }); test('supportsDeclarationKind', () { for (var kind in DeclarationKind.values) { for (var phase in Phase.values) { var instance = instancesByKindAndPhase[kind]?[phase]; if (instance == null) continue; for (var otherKind in DeclarationKind.values) { var expected = false; if (kind == otherKind) { expected = true; } else if (kind == DeclarationKind.function && otherKind == DeclarationKind.method) { expected = true; } else if (kind == DeclarationKind.variable && otherKind == DeclarationKind.field) { expected = true; } expect(instance.supportsDeclarationKind(otherKind), expected, reason: 'Expected a $kind macro to ${expected ? '' : 'not '}' 'support a $otherKind'); } } } }); }); } final Map> instancesByKindAndPhase = { DeclarationKind.classType: { Phase.types: MacroInstanceIdentifierImpl( FakeClassTypesMacro(), RemoteInstance.uniqueId), Phase.declarations: MacroInstanceIdentifierImpl( FakeClassDeclarationsMacro(), RemoteInstance.uniqueId), Phase.definitions: MacroInstanceIdentifierImpl( FakeClassDefinitionMacro(), RemoteInstance.uniqueId), }, DeclarationKind.constructor: { Phase.types: MacroInstanceIdentifierImpl( FakeConstructorTypesMacro(), RemoteInstance.uniqueId), Phase.declarations: MacroInstanceIdentifierImpl( FakeConstructorDeclarationsMacro(), RemoteInstance.uniqueId), Phase.definitions: MacroInstanceIdentifierImpl( FakeConstructorDefinitionMacro(), RemoteInstance.uniqueId), }, DeclarationKind.enumType: { Phase.types: MacroInstanceIdentifierImpl( FakeEnumTypesMacro(), RemoteInstance.uniqueId), Phase.declarations: MacroInstanceIdentifierImpl( FakeEnumDeclarationsMacro(), RemoteInstance.uniqueId), Phase.definitions: MacroInstanceIdentifierImpl( FakeEnumDefinitionMacro(), RemoteInstance.uniqueId), }, DeclarationKind.enumValue: { Phase.types: MacroInstanceIdentifierImpl( FakeEnumValueTypesMacro(), RemoteInstance.uniqueId), Phase.declarations: MacroInstanceIdentifierImpl( FakeEnumValueDeclarationsMacro(), RemoteInstance.uniqueId), Phase.definitions: MacroInstanceIdentifierImpl( FakeEnumValueDefinitionMacro(), RemoteInstance.uniqueId), }, DeclarationKind.extension: { Phase.types: MacroInstanceIdentifierImpl( FakeExtensionTypesMacro(), RemoteInstance.uniqueId), Phase.declarations: MacroInstanceIdentifierImpl( FakeExtensionDeclarationsMacro(), RemoteInstance.uniqueId), Phase.definitions: MacroInstanceIdentifierImpl( FakeExtensionDefinitionMacro(), RemoteInstance.uniqueId), }, DeclarationKind.extensionType: { Phase.types: MacroInstanceIdentifierImpl( FakeExtensionTypeTypesMacro(), RemoteInstance.uniqueId), Phase.declarations: MacroInstanceIdentifierImpl( FakeExtensionTypeDeclarationsMacro(), RemoteInstance.uniqueId), Phase.definitions: MacroInstanceIdentifierImpl( FakeExtensionTypeDefinitionMacro(), RemoteInstance.uniqueId), }, DeclarationKind.field: { Phase.types: MacroInstanceIdentifierImpl( FakeFieldTypesMacro(), RemoteInstance.uniqueId), Phase.declarations: MacroInstanceIdentifierImpl( FakeFieldDeclarationsMacro(), RemoteInstance.uniqueId), Phase.definitions: MacroInstanceIdentifierImpl( FakeFieldDefinitionMacro(), RemoteInstance.uniqueId), }, DeclarationKind.function: { Phase.types: MacroInstanceIdentifierImpl( FakeFunctionTypesMacro(), RemoteInstance.uniqueId), Phase.declarations: MacroInstanceIdentifierImpl( FakeFunctionDeclarationsMacro(), RemoteInstance.uniqueId), Phase.definitions: MacroInstanceIdentifierImpl( FakeFunctionDefinitionMacro(), RemoteInstance.uniqueId), }, DeclarationKind.library: { Phase.types: MacroInstanceIdentifierImpl( FakeLibraryTypesMacro(), RemoteInstance.uniqueId), Phase.declarations: MacroInstanceIdentifierImpl( FakeLibraryDeclarationsMacro(), RemoteInstance.uniqueId), Phase.definitions: MacroInstanceIdentifierImpl( FakeLibraryDefinitionMacro(), RemoteInstance.uniqueId), }, DeclarationKind.method: { Phase.types: MacroInstanceIdentifierImpl( FakeMethodTypesMacro(), RemoteInstance.uniqueId), Phase.declarations: MacroInstanceIdentifierImpl( FakeMethodDeclarationsMacro(), RemoteInstance.uniqueId), Phase.definitions: MacroInstanceIdentifierImpl( FakeMethodDefinitionMacro(), RemoteInstance.uniqueId), }, DeclarationKind.mixinType: { Phase.types: MacroInstanceIdentifierImpl( FakeMixinTypesMacro(), RemoteInstance.uniqueId), Phase.declarations: MacroInstanceIdentifierImpl( FakeMixinDeclarationsMacro(), RemoteInstance.uniqueId), Phase.definitions: MacroInstanceIdentifierImpl( FakeMixinDefinitionMacro(), RemoteInstance.uniqueId), }, DeclarationKind.typeAlias: { Phase.types: MacroInstanceIdentifierImpl( FakeTypeAliasTypesMacro(), RemoteInstance.uniqueId), Phase.declarations: MacroInstanceIdentifierImpl( FakeTypeAliasDeclarationsMacro(), RemoteInstance.uniqueId), }, DeclarationKind.variable: { Phase.types: MacroInstanceIdentifierImpl( FakeVariableTypesMacro(), RemoteInstance.uniqueId), Phase.declarations: MacroInstanceIdentifierImpl( FakeVariableDeclarationsMacro(), RemoteInstance.uniqueId), Phase.definitions: MacroInstanceIdentifierImpl( FakeVariableDefinitionMacro(), RemoteInstance.uniqueId), }, }; class FakeClassTypesMacro extends Fake implements ClassTypesMacro {} class FakeClassDeclarationsMacro extends Fake implements ClassDeclarationsMacro {} class FakeClassDefinitionMacro extends Fake implements ClassDefinitionMacro {} class FakeConstructorTypesMacro extends Fake implements ConstructorTypesMacro {} class FakeConstructorDeclarationsMacro extends Fake implements ConstructorDeclarationsMacro {} class FakeConstructorDefinitionMacro extends Fake implements ConstructorDefinitionMacro {} class FakeFieldTypesMacro extends Fake implements FieldTypesMacro {} class FakeFieldDeclarationsMacro extends Fake implements FieldDeclarationsMacro {} class FakeFieldDefinitionMacro extends Fake implements FieldDefinitionMacro {} class FakeFunctionTypesMacro extends Fake implements FunctionTypesMacro {} class FakeFunctionDeclarationsMacro extends Fake implements FunctionDeclarationsMacro {} class FakeFunctionDefinitionMacro extends Fake implements FunctionDefinitionMacro {} class FakeMethodTypesMacro extends Fake implements MethodTypesMacro {} class FakeMethodDeclarationsMacro extends Fake implements MethodDeclarationsMacro {} class FakeMethodDefinitionMacro extends Fake implements MethodDefinitionMacro {} class FakeVariableTypesMacro extends Fake implements VariableTypesMacro {} class FakeVariableDeclarationsMacro extends Fake implements VariableDeclarationsMacro {} class FakeVariableDefinitionMacro extends Fake implements VariableDefinitionMacro {} class FakeMixinTypesMacro extends Fake implements MixinTypesMacro {} class FakeMixinDeclarationsMacro extends Fake implements MixinDeclarationsMacro {} class FakeMixinDefinitionMacro extends Fake implements MixinDefinitionMacro {} class FakeEnumTypesMacro extends Fake implements EnumTypesMacro {} class FakeEnumDeclarationsMacro extends Fake implements EnumDeclarationsMacro {} class FakeEnumDefinitionMacro extends Fake implements EnumDefinitionMacro {} class FakeEnumValueTypesMacro extends Fake implements EnumValueTypesMacro {} class FakeEnumValueDeclarationsMacro extends Fake implements EnumValueDeclarationsMacro {} class FakeEnumValueDefinitionMacro extends Fake implements EnumValueDefinitionMacro {} class FakeExtensionTypesMacro extends Fake implements ExtensionTypesMacro {} class FakeExtensionDeclarationsMacro extends Fake implements ExtensionDeclarationsMacro {} class FakeExtensionDefinitionMacro extends Fake implements ExtensionDefinitionMacro {} class FakeExtensionTypeTypesMacro extends Fake implements ExtensionTypeTypesMacro {} class FakeExtensionTypeDeclarationsMacro extends Fake implements ExtensionTypeDeclarationsMacro {} class FakeExtensionTypeDefinitionMacro extends Fake implements ExtensionTypeDefinitionMacro {} class FakeLibraryTypesMacro extends Fake implements LibraryTypesMacro {} class FakeLibraryDeclarationsMacro extends Fake implements LibraryDeclarationsMacro {} class FakeLibraryDefinitionMacro extends Fake implements LibraryDefinitionMacro {} class FakeTypeAliasTypesMacro extends Fake implements TypeAliasTypesMacro {} class FakeTypeAliasDeclarationsMacro extends Fake implements TypeAliasDeclarationsMacro {}