// 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);
    });
  });
}
