Files
2026-01-15 14:38:46 -08:00

238 lines
6.6 KiB
Dart

// Copyright 2017 Google Inc.
//
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file or at
// https://developers.google.com/open-source/licenses/bsd
import 'package:analyzer/analyzer.dart';
import 'package:ngflutter/src/visitors/dart_class_info.dart';
import 'package:ngflutter/src/visitors/dart_class_visitor.dart';
import 'package:test/test.dart';
void main() {
group('DartClassVisitor', () {
Map<String, DartClassInfo> visit(String content) {
var compilationUnit = parseCompilationUnit(content);
var out = <String, DartClassInfo>{};
var visitor = new DartClassVisitor('', out, {});
compilationUnit.accept(visitor);
return out;
}
test('should collect OpaqueToken', () {
var classInfo =
visit("const token = const OpaqueToken('token');")['token'];
expect(classInfo, isNotNull);
});
test('should collect the components constructor types', () {
var classInfo = visit("""
library x;
class Cons {
Cons(String x, Exotic y);
}
""")['Cons'];
expect(
classInfo.constructorParameters
.map((parameter) => parameter.dependency),
equals(['String', 'Exotic']));
expect(classInfo.constructorParameters.map((parameter) => parameter.name),
equals(['x', 'y']));
});
test('should collect constructor types which reference this', () {
var classInfo = visit("""
library x;
class Cons {
final String y;
Cons(this.y, Exotic z);
}
""")['Cons'];
expect(
classInfo.constructorParameters
.map((parameter) => parameter.dependency),
equals(['String', 'Exotic']));
expect(classInfo.constructorParameters.map((parameter) => parameter.name),
equals(['y', 'z']));
});
test('should collect member type for field declaration', () {
var classInfo = visit("""
class Cons {
final x = new Clock.fixed();
List<SomeThing> y;
}
""")['Cons'];
expect(classInfo.memberTypes['x'].className, equals('Clock'));
expect(classInfo.memberTypes['y'].className, equals('List<SomeThing>'));
});
test(
'should collect constructor types which reference this'
' and defined after constructor', () {
var classInfo = visit("""
library x;
class Cons {
final String y;
Cons(this.x, this.y, List<Exotic> z);
SomeClass x;
}
""")['Cons'];
expect(
classInfo.constructorParameters
.map((parameter) => parameter.dependency),
equals(['SomeClass', 'String', 'List<Exotic>']));
expect(classInfo.constructorParameters.map((parameter) => parameter.name),
equals(['x', 'y', 'z']));
});
test('should collect classes types with implicit constructors', () {
var classInfo = visit("""
library x;
class Cons {
final String y;
}
""")['Cons'];
expect(classInfo.constructorParameters, equals([]));
});
test('shoulde collect extends clauses', () {
var classInfo = visit("""
library x;
class Cons extends SuperAwesomeBase {
}
""")['Cons'];
expect(classInfo.extendsType, equals('SuperAwesomeBase'));
});
test('should collect implements clauses', () {
var classInfo = visit("""
library x;
class Cons implements dull.DullInterface, AwesomeInterface {
}
""")['Cons'];
expect(classInfo.implementsTypes,
equals(['DullInterface', 'AwesomeInterface']));
});
test('should skip optional parameter', () {
var classInfo = visit("""
library x;
class Cons {
Cons(@Optional() String x, @SkipSelf() Exotic y);
}
""")['Cons'];
expect(classInfo.constructorParameters.isEmpty, true);
});
test('should get type from @Inject(MyString)', () {
var classInfo = visit("""
library x;
class Cons {
final String y;
Cons(@Inject(MyString) String x, @Inject(YString) this.y);
}
""")['Cons'];
expect(
classInfo.constructorParameters
.map((parameter) => parameter.dependency),
equals(['MyString', 'YString']));
expect(classInfo.constructorParameters.map((parameter) => parameter.name),
equals(['x', 'y']));
});
test("should get type from @Inject('someString')", () {
var classInfo = visit("""
library x;
class Cons {
final String y;
Cons(@Inject('someString') String x, @Inject(YString) this.y);
}
""")['Cons'];
expect(
classInfo.constructorParameters
.map((parameter) => parameter.dependency),
equals(['someString', 'YString']));
expect(classInfo.constructorParameters.map((parameter) => parameter.name),
equals(['x', 'y']));
});
test('should get type from @Inject(const MyString())', () {
var classInfo = visit("""
library x;
class Cons {
final String y;
Cons(@Inject(const MyString()) String x,
@Inject(const YString()) this.y);
}
""")['Cons'];
expect(
classInfo.constructorParameters
.map((parameter) => parameter.dependency),
equals(['MyString', 'YString']));
expect(classInfo.constructorParameters.map((parameter) => parameter.name),
equals(['x', 'y']));
});
test('should get type from @MyString()', () {
var classInfo = visit("""
library x;
class Cons {
final String y;
Cons(@MyString String x,
@YString this.y);
}
""")['Cons'];
expect(
classInfo.constructorParameters
.map((parameter) => parameter.dependency),
equals(['MyString', 'YString']));
expect(classInfo.constructorParameters.map((parameter) => parameter.name),
equals(['x', 'y']));
});
test('should get member type for setter', () {
var classInfo = visit("""
class Cons {
var x;
var y;
var z;
Cons();
set x(String value){x = value;}
set y(value){y = value;}
set z(List<String> value){z = value;}
}
""")['Cons'];
expect(classInfo.memberTypes['x'].className, equals('String'));
expect(classInfo.memberTypes['y'].className, equals('dynamic'));
expect(classInfo.memberTypes['z'].className, equals('List<String>'));
});
});
}