blob: 53f650dc0cc6403ceb4ebd7da52c903de9051ee2 [file] [log] [blame]
// Copyright (c) 2019, 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/src/dart/analysis/experiments.dart';
import 'package:analyzer/src/generated/engine.dart';
import 'package:analyzer/src/summary2/ast_binary_reader.dart';
import 'package:analyzer/src/summary2/ast_binary_writer.dart';
import 'package:analyzer/src/summary2/linked_bundle_context.dart';
import 'package:analyzer/src/summary2/linked_element_factory.dart';
import 'package:analyzer/src/summary2/linked_unit_context.dart';
import 'package:analyzer/src/summary2/linking_bundle_context.dart';
import 'package:analyzer/src/summary2/reference.dart';
import 'package:analyzer/src/summary2/tokens_writer.dart';
import 'package:test/test.dart';
import 'package:test_reflective_loader/test_reflective_loader.dart';
import '../dart/resolution/driver_resolution.dart';
main() {
defineReflectiveSuite(() {
defineReflectiveTests(AstBinaryWriterTest);
});
}
/// Just a very simple test that at least something works.
@reflectiveTest
class AstBinaryWriterTest extends DriverResolutionTest {
@override
AnalysisOptionsImpl get analysisOptions => AnalysisOptionsImpl()
..enabledExperiments = [
EnableString.control_flow_collections,
EnableString.non_nullable,
EnableString.spread_collections,
];
test_classTypeAlias() async {
_assertUnresolvedCode('''
mixin M1 {}
mixin M2 {}
class I1 {}
class I2 {}
class X = Object with M1, M2 implements I1, I2;
''');
}
test_configuration() async {
_assertUnresolvedCode('''
import 'dart:math'
if (a.b.c == 'd1') 'e1'
if (a.b.c == 'd2') 'e2';
''');
}
test_emptyStatement() async {
_assertUnresolvedCode('''
main() {
if (true);
}
''');
}
test_forElement() async {
_assertUnresolvedCode('''
main() {
return [1, for (var i = 0; i < 10; i++) i * i, 2];
}
''');
}
test_ifElement() async {
_assertUnresolvedCode('''
main(bool b) {
return [1, if (b) 2 else 3, 4];
}
''');
}
test_labeledStatement() async {
_assertUnresolvedCode('''
main() {
a: b: 42;
}
''');
}
test_scriptTag() async {
_assertUnresolvedCode('''
#!/bin/dart
main() {}
''');
}
test_simple() async {
_assertUnresolvedCode('''
const zero = 0;
@zero
class A<T extends num> {}
class B extends A<int> {}
void f() { // ref
1 + 2.0;
<double>[1, 2];
}
''');
}
test_spreadElement() async {
_assertUnresolvedCode('''
main() {
var a = [1, 2, 3];
return [...a];
}
''');
}
void _assertUnresolvedCode(String inputCode) {
var path = convertPath('/test/lib/test.dart');
newFile(path, content: inputCode);
var parseResult = driver.parseFileSync(path);
var originalUnit = parseResult.unit;
var originalCode = originalUnit.toSource();
var tokensResult = TokensWriter().writeTokens(
originalUnit.beginToken,
originalUnit.endToken,
);
var tokensContext = tokensResult.toContext();
var rootReference = Reference.root();
var dynamicRef = rootReference.getChild('dart:core').getChild('dynamic');
var linkingBundleContext = LinkingBundleContext(dynamicRef);
var writer = new AstBinaryWriter(linkingBundleContext, tokensContext);
var builder = writer.writeNode(originalUnit);
var bundleContext = LinkedBundleContext(
LinkedElementFactory(null, null, rootReference),
linkingBundleContext.referencesBuilder,
);
var unitContext = LinkedUnitContext(bundleContext, tokensContext);
var reader = AstBinaryReader(unitContext);
var deserializedUnit = reader.readNode(builder);
var deserializedCode = deserializedUnit.toSource();
expect(deserializedCode, originalCode);
}
}