blob: 14cbae13aee03d3074d917533b792c6244f08a70 [file] [log] [blame]
// Copyright (c) 2017, 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.
// @dart = 2.9
import 'package:front_end/src/base/libraries_specification.dart';
import 'package:test/test.dart';
main() {
group('parse', () {
test('top-level must be a map', () async {
var jsonString = '[]';
expect(
() => LibrariesSpecification.parse(
Uri.parse('org-dartlang-test:///f.json'), jsonString),
throwsA((e) => e is LibrariesSpecificationException));
jsonString = '""';
expect(
() => LibrariesSpecification.parse(
Uri.parse('org-dartlang-test:///f.json'), jsonString),
throwsA((e) => e is LibrariesSpecificationException));
});
test('target entry must be a map', () async {
var jsonString = '{"vm" : []}';
expect(
() => LibrariesSpecification.parse(
Uri.parse('org-dartlang-test:///f.json'), jsonString),
throwsA((e) => e is LibrariesSpecificationException));
jsonString = '{"vm" : ""}';
expect(
() => LibrariesSpecification.parse(
Uri.parse('org-dartlang-test:///f.json'), jsonString),
throwsA((e) => e is LibrariesSpecificationException));
});
test('library entry must exist', () async {
var jsonString = '{"vm" : {}}';
expect(
() => LibrariesSpecification.parse(
Uri.parse('org-dartlang-test:///f.json'), jsonString),
throwsA((e) => e is LibrariesSpecificationException));
});
test('library entry must be a map', () async {
var jsonString = '{"vm" : {"libraries": []}}';
expect(
() => LibrariesSpecification.parse(
Uri.parse('org-dartlang-test:///f.json'), jsonString),
throwsA((e) => e is LibrariesSpecificationException));
});
test('uri must be a string', () async {
var jsonString = '{"vm" : {"libraries": {"core": {"uri": 3}}}';
expect(
() => LibrariesSpecification.parse(
Uri.parse('org-dartlang-test:///f.json'), jsonString),
throwsA((e) => e is LibrariesSpecificationException));
});
test('patches must be a string or list of string', () async {
var jsonString = '''
{
"none": {
"libraries": {
"c" : {
"uri": "c/main.dart",
"patches": 3
}
}
}
}
''';
expect(
() => LibrariesSpecification.parse(
Uri.parse('org-dartlang-test:///f.json'), jsonString),
throwsA((e) => e is LibrariesSpecificationException));
jsonString = '''
{
"none": {
"libraries": {
"c" : {
"uri": "c/main.dart",
"patches": "a.dart"
}
}
}
}
''';
var spec = LibrariesSpecification.parse(
Uri.parse('org-dartlang-test:///f.json'), jsonString);
expect(spec.specificationFor("none").libraryInfoFor("c").patches.first,
Uri.parse('org-dartlang-test:///a.dart'));
jsonString = '''
{
"none": {
"libraries": {
"c" : {
"uri": "c/main.dart",
"patches": ["a.dart"]
}
}
}
}
''';
spec = LibrariesSpecification.parse(
Uri.parse('org-dartlang-test:///f.json'), jsonString);
expect(spec.specificationFor("none").libraryInfoFor("c").patches.first,
Uri.parse('org-dartlang-test:///a.dart'));
});
test('patches are optional in the format', () async {
var jsonString = '''
{ "none": { "libraries": {"c" : { "uri": "c/main.dart" }}}}
''';
var spec = LibrariesSpecification.parse(
Uri.parse('org-dartlang-test:///one/two/f.json'), jsonString);
expect(spec, isNotNull);
expect(
spec.specificationFor('none').libraryInfoFor('c').patches, isEmpty);
});
test('library paths are resolved from spec uri', () async {
var jsonString = '''
{ "none": { "libraries": {"c" : { "uri": "c/main.dart" }}}}
''';
var spec = LibrariesSpecification.parse(
Uri.parse('org-dartlang-test:///one/two/f.json'), jsonString);
expect(spec.specificationFor('none').libraryInfoFor('c').uri,
Uri.parse('org-dartlang-test:///one/two/c/main.dart'));
});
test('patches paths are resolved from spec uri', () async {
var jsonString = '''
{
"none": {
"libraries": {
"c" : {
"uri": "c/main.dart",
"patches": [
"../a/p1.dart",
"../a/p2.dart"
]
}
}
}
}
''';
var spec = LibrariesSpecification.parse(
Uri.parse('org-dartlang-test:///one/two/f.json'), jsonString);
expect(spec.specificationFor('none').libraryInfoFor('c').patches[0],
Uri.parse('org-dartlang-test:///one/a/p1.dart'));
expect(spec.specificationFor('none').libraryInfoFor('c').patches[1],
Uri.parse('org-dartlang-test:///one/a/p2.dart'));
});
test('multiple targets are supported', () async {
var jsonString = '''
{
"vm": {
"libraries": {
"foo" : {
"uri": "a/main.dart",
"patches": [
"a/p1.dart",
"a/p2.dart"
]
},
"bar" : {
"uri": "b/main.dart",
"patches": [
"b/p3.dart"
]
}
}
},
"none": {
"libraries": {
"c" : {
"uri": "c/main.dart"
}
}
}
}
''';
var spec = LibrariesSpecification.parse(
Uri.parse('org-dartlang-test:///one/two/f.json'), jsonString);
expect(spec.specificationFor('vm').libraryInfoFor('foo').uri,
Uri.parse('org-dartlang-test:///one/two/a/main.dart'));
expect(spec.specificationFor('vm').libraryInfoFor('bar').uri,
Uri.parse('org-dartlang-test:///one/two/b/main.dart'));
expect(spec.specificationFor('none').libraryInfoFor('c').uri,
Uri.parse('org-dartlang-test:///one/two/c/main.dart'));
});
test('supported entry must be bool', () async {
var jsonString = '{"vm" : {"libraries": {"core": '
'{"uri": "main.dart", "supported": 3}},';
expect(
() => LibrariesSpecification.parse(
Uri.parse('org-dartlang-test:///f.json'), jsonString),
throwsA((e) => e is LibrariesSpecificationException));
});
test('supported entry is copied correctly when parsing', () async {
var jsonString = '''
{
"vm": {
"libraries": {
"foo" : {
"uri": "a/main.dart",
"patches": [
"a/p1.dart",
"a/p2.dart"
],
"supported": false
},
"bar" : {
"uri": "b/main.dart",
"patches": [
"b/p3.dart"
],
"supported": true
},
"baz" : {
"uri": "b/main.dart",
"patches": [
"b/p3.dart"
]
}
}
}
}
''';
var spec = LibrariesSpecification.parse(
Uri.parse('org-dartlang-test:///one/two/f.json'), jsonString);
expect(
spec.specificationFor('vm').libraryInfoFor('foo').isSupported, false);
expect(
spec.specificationFor('vm').libraryInfoFor('bar').isSupported, true);
expect(
spec.specificationFor('vm').libraryInfoFor('baz').isSupported, true);
});
});
group('toJson', () {
test('serialization produces same data that was parsed', () async {
var jsonString = '''
{
"vm": {
"libraries": {
"foo" : {
"uri": "a/main.dart",
"patches": [
"a/p1.dart",
"a/p2.dart"
],
"supported": false
},
"bar" : {
"uri": "b/main.dart",
"patches": [
"b/p3.dart"
]
}
}
},
"none": {
"libraries": {
"c" : {
"uri": "c/main.dart",
"patches": []
}
}
}
}
''';
var spec = LibrariesSpecification.parse(
Uri.parse('org-dartlang-test:///one/two/f.json'), jsonString);
var newJson =
spec.toJsonString(Uri.parse('org-dartlang-test:///one/two/g.json'));
expect(jsonString.replaceAll(new RegExp('\\s'), ''), newJson);
});
test('serialization can adapt to new file location', () async {
var jsonString = '''
{
"vm": {
"libraries": {
"foo" : {
"uri": "a/main.dart",
"patches": [
"a/p1.dart",
"a/p2.dart"
]
},
"bar" : {
"uri": "b/main.dart",
"patches": [
"b/p3.dart"
]
}
}
},
"none": {
"libraries": {
"c" : {
"uri": "c/main.dart"
}
}
}
}
''';
var spec = LibrariesSpecification.parse(
Uri.parse('org-dartlang-test:///one/two/f.json'), jsonString);
var newJson =
spec.toJsonString(Uri.parse('org-dartlang-test:///one/g.json'));
var expected = '''
{
"vm": {
"libraries": {
"foo" : {
"uri": "two/a/main.dart",
"patches": [
"two/a/p1.dart",
"two/a/p2.dart"
]
},
"bar" : {
"uri": "two/b/main.dart",
"patches": [
"two/b/p3.dart"
]
}
}
},
"none": {
"libraries": {
"c" : {
"uri": "two/c/main.dart",
"patches": []
}
}
}
}
''';
expect(expected.replaceAll(new RegExp('\\s'), ''), newJson);
});
});
}