blob: f6e63adfdde98638273eb8b5250ea53098be610b [file] [log] [blame]
// 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<DeclarationKind, Map<Phase, MacroInstanceIdentifierImpl>>
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 {}