blob: 255e072c40c27dd687e7e51863b25e31df35d80a [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:_fe_analyzer_shared/src/sdk/allowed_experiments.dart';
import 'package:test/test.dart';
main() {
group('invalid', () {
void assertFormalException(String text) {
expect(() {
return parseAllowedExperiments(text);
}, throwsFormatException);
}
test('not map', () {
assertFormalException('42');
});
test('no version', () {
assertFormalException('{}');
});
test('version not int', () {
assertFormalException('''
{
"version": "abc"
}
''');
});
test('version not int 1', () {
assertFormalException('''
{
"version": 2
}
''');
});
test('no experiment sets', () {
assertFormalException('''
{
"version": 1,
}
''');
});
test('experimentSet: not map', () {
assertFormalException('''
{
"version": 1,
"experimentSets": 42
}
''');
});
test('experimentSet entry: not list', () {
assertFormalException('''
{
"version": 1,
"experimentSets": {
"nullSafety": 42
}
}
''');
});
test('no sdk', () {
assertFormalException('''
{
"version": 1,
"experimentSets": {
"nullSafety": ["non-nullable"]
}
}
''');
});
test('no sdk / default', () {
assertFormalException('''
{
"version": 1,
"experimentSets": {
"nullSafety": ["non-nullable"]
},
"sdk": {}
}
''');
});
test('experimentSet not string', () {
assertFormalException('''
{
"version": 1,
"experimentSets": {
"nullSafety": ["non-nullable"]
},
"sdk": {
"default": {
"experimentSet": 42
}
}
}
''');
});
test('experimentSet not defined', () {
assertFormalException('''
{
"version": 1,
"experimentSets": {
"nullSafety": ["non-nullable"]
},
"sdk": {
"default": {
"experimentSet": "notDefined"
}
}
}
''');
});
test('sdk libraries not map', () {
assertFormalException('''
{
"version": 1,
"experimentSets": {
"nullSafety": ["non-nullable"]
},
"sdk": {
"default": {
"experimentSet": "nullSafety"
},
"libraries": 42
}
}
''');
});
test('packages not map', () {
assertFormalException('''
{
"version": 1,
"experimentSets": {
"nullSafety": ["non-nullable"]
},
"sdk": {
"default": {
"experimentSet": "nullSafety"
}
},
"packages": 42
}
''');
});
});
group('valid', () {
void assertExperiments(
AllowedExperiments experiments, {
required List<String> sdkDefaultExperiments,
required Map<String, List<String>> sdkLibraryExperiments,
required Map<String, List<String>> packageExperiments,
}) {
expect(experiments.sdkDefaultExperiments, sdkDefaultExperiments);
expect(experiments.sdkLibraryExperiments, sdkLibraryExperiments);
expect(experiments.packageExperiments, packageExperiments);
}
test('sdk default, no sdk libraries, no packages', () {
var experiments = parseAllowedExperiments('''
{
"version": 1,
"experimentSets": {
"foo": ["foo1"]
},
"sdk": {
"default": {
"experimentSet": "foo"
}
}
}
''');
assertExperiments(
experiments,
sdkDefaultExperiments: ['foo1'],
sdkLibraryExperiments: {},
packageExperiments: {},
);
});
test('sdk default, sdk libraries, no packages', () {
var experiments = parseAllowedExperiments('''
{
"version": 1,
"experimentSets": {
"foo": ["foo1"],
"bar": ["bar1", "bar2"]
},
"sdk": {
"default": {
"experimentSet": "foo"
},
"libraries": {
"sdkA": {
"experimentSet": "foo"
},
"sdkB": {
"experimentSet": "bar"
}
}
}
}
''');
assertExperiments(
experiments,
sdkDefaultExperiments: ['foo1'],
sdkLibraryExperiments: {
"sdkA": ['foo1'],
"sdkB": ['bar1', 'bar2'],
},
packageExperiments: {},
);
});
test('sdk default, sdk libraries, packages', () {
var experiments = parseAllowedExperiments('''
{
"version": 1,
"experimentSets": {
"foo": ["foo1"],
"bar": ["bar1", "bar2"],
"baz": ["baz1", "baz2"]
},
"sdk": {
"default": {
"experimentSet": "foo"
},
"libraries": {
"sdkA": {
"experimentSet": "bar"
},
"sdkB": {
"experimentSet": "baz"
}
}
},
"packages": {
"pkgA": {
"experimentSet": "bar"
},
"pkgB": {
"experimentSet": "baz"
}
}
}
''');
assertExperiments(
experiments,
sdkDefaultExperiments: ['foo1'],
sdkLibraryExperiments: {
"sdkA": ['bar1', 'bar2'],
"sdkB": ['baz1', 'baz2'],
},
packageExperiments: {
"pkgA": ['bar1', 'bar2'],
"pkgB": ['baz1', 'baz2'],
},
);
expect(experiments.forSdkLibrary('core'), ['foo1']);
expect(experiments.forSdkLibrary('sdkA'), ['bar1', 'bar2']);
expect(experiments.forSdkLibrary('sdkB'), ['baz1', 'baz2']);
expect(experiments.forPackage('pkgA'), ['bar1', 'bar2']);
expect(experiments.forPackage('pkgB'), ['baz1', 'baz2']);
expect(experiments.forPackage('pkgC'), isNull);
});
});
}