// 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 'dart:convert';
import 'dart:typed_data';

import 'package:test/test.dart';

import 'package:package_config/package_config_types.dart';
import 'package:package_config/src/packages_file.dart' as packages;
import 'package:package_config/src/package_config_json.dart';
import 'src/util.dart';

void throwError(Object error) => throw error;

void main() {
  group('.packages', () {
    test('valid', () {
      var packagesFile = '# Generated by pub yadda yadda\n'
          'foo:file:///foo/lib/\n'
          'bar:/bar/lib/\n'
          'baz:lib/\n';
      var result = packages.parse(utf8.encode(packagesFile),
          Uri.parse('file:///tmp/file.dart'), throwError);
      expect(result.version, 1);
      expect({for (var p in result.packages) p.name}, {'foo', 'bar', 'baz'});
      expect(result.resolve(pkg('foo', 'foo.dart')),
          Uri.parse('file:///foo/lib/foo.dart'));
      expect(result.resolve(pkg('bar', 'bar.dart')),
          Uri.parse('file:///bar/lib/bar.dart'));
      expect(result.resolve(pkg('baz', 'baz.dart')),
          Uri.parse('file:///tmp/lib/baz.dart'));

      var foo = result['foo']!;
      expect(foo, isNotNull);
      expect(foo.root, Uri.parse('file:///foo/'));
      expect(foo.packageUriRoot, Uri.parse('file:///foo/lib/'));
      expect(foo.languageVersion, LanguageVersion(2, 7));
      expect(foo.relativeRoot, false);
    });

    test('valid empty', () {
      var packagesFile = '# Generated by pub yadda yadda\n';
      var result = packages.parse(
          utf8.encode(packagesFile), Uri.file('/tmp/file.dart'), throwError);
      expect(result.version, 1);
      expect({for (var p in result.packages) p.name}, <String>{});
    });

    group('invalid', () {
      var baseFile = Uri.file('/tmp/file.dart');
      void testThrows(String name, String content) {
        test(name, () {
          expect(
              () => packages.parse(utf8.encode(content), baseFile, throwError),
              throwsA(TypeMatcher<FormatException>()));
        });
        test(name + ', handle error', () {
          var hadError = false;
          packages.parse(utf8.encode(content), baseFile, (error) {
            hadError = true;
            expect(error, isA<FormatException>());
          });
          expect(hadError, true);
        });
      }

      testThrows('repeated package name', 'foo:lib/\nfoo:lib\n');
      testThrows('no colon', 'foo\n');
      testThrows('empty package name', ':lib/\n');
      testThrows('dot only package name', '.:lib/\n');
      testThrows('dot only package name', '..:lib/\n');
      testThrows('invalid package name character', 'f\\o:lib/\n');
      testThrows('package URI', 'foo:package:bar/lib/');
      testThrows('location with query', 'f\\o:lib/?\n');
      testThrows('location with fragment', 'f\\o:lib/#\n');
    });
  });

  group('package_config.json', () {
    test('valid', () {
      var packageConfigFile = '''
        {
          "configVersion": 2,
          "packages": [
            {
              "name": "foo",
              "rootUri": "file:///foo/",
              "packageUri": "lib/",
              "languageVersion": "2.5",
              "nonstandard": true
            },
            {
              "name": "bar",
              "rootUri": "/bar/",
              "packageUri": "lib/",
              "languageVersion": "9999.9999"
            },
            {
              "name": "baz",
              "rootUri": "../",
              "packageUri": "lib/"
            },
            {
              "name": "noslash",
              "rootUri": "../noslash",
              "packageUri": "lib"
            }
          ],
          "generator": "pub",
          "other": [42]
        }
        ''';
      var config = parsePackageConfigBytes(
          utf8.encode(packageConfigFile) as Uint8List,
          Uri.parse('file:///tmp/.dart_tool/file.dart'),
          throwError);
      expect(config.version, 2);
      expect({for (var p in config.packages) p.name},
          {'foo', 'bar', 'baz', 'noslash'});

      expect(config.resolve(pkg('foo', 'foo.dart')),
          Uri.parse('file:///foo/lib/foo.dart'));
      expect(config.resolve(pkg('bar', 'bar.dart')),
          Uri.parse('file:///bar/lib/bar.dart'));
      expect(config.resolve(pkg('baz', 'baz.dart')),
          Uri.parse('file:///tmp/lib/baz.dart'));

      var foo = config['foo']!;
      expect(foo, isNotNull);
      expect(foo.root, Uri.parse('file:///foo/'));
      expect(foo.packageUriRoot, Uri.parse('file:///foo/lib/'));
      expect(foo.languageVersion, LanguageVersion(2, 5));
      expect(foo.extraData, {'nonstandard': true});
      expect(foo.relativeRoot, false);

      var bar = config['bar']!;
      expect(bar, isNotNull);
      expect(bar.root, Uri.parse('file:///bar/'));
      expect(bar.packageUriRoot, Uri.parse('file:///bar/lib/'));
      expect(bar.languageVersion, LanguageVersion(9999, 9999));
      expect(bar.extraData, null);
      expect(bar.relativeRoot, false);

      var baz = config['baz']!;
      expect(baz, isNotNull);
      expect(baz.root, Uri.parse('file:///tmp/'));
      expect(baz.packageUriRoot, Uri.parse('file:///tmp/lib/'));
      expect(baz.languageVersion, null);
      expect(baz.relativeRoot, true);

      // No slash after root or package root. One is inserted.
      var noslash = config['noslash']!;
      expect(noslash, isNotNull);
      expect(noslash.root, Uri.parse('file:///tmp/noslash/'));
      expect(noslash.packageUriRoot, Uri.parse('file:///tmp/noslash/lib/'));
      expect(noslash.languageVersion, null);
      expect(noslash.relativeRoot, true);

      expect(config.extraData, {
        'generator': 'pub',
        'other': [42]
      });
    });

    test('valid other order', () {
      // The ordering in the file is not important.
      var packageConfigFile = '''
        {
          "generator": "pub",
          "other": [42],
          "packages": [
            {
              "languageVersion": "2.5",
              "packageUri": "lib/",
              "rootUri": "file:///foo/",
              "name": "foo"
            },
            {
              "packageUri": "lib/",
              "languageVersion": "9999.9999",
              "rootUri": "/bar/",
              "name": "bar"
            },
            {
              "packageUri": "lib/",
              "name": "baz",
              "rootUri": "../"
            }
          ],
          "configVersion": 2
        }
        ''';
      var config = parsePackageConfigBytes(
          utf8.encode(packageConfigFile) as Uint8List,
          Uri.parse('file:///tmp/.dart_tool/file.dart'),
          throwError);
      expect(config.version, 2);
      expect({for (var p in config.packages) p.name}, {'foo', 'bar', 'baz'});

      expect(config.resolve(pkg('foo', 'foo.dart')),
          Uri.parse('file:///foo/lib/foo.dart'));
      expect(config.resolve(pkg('bar', 'bar.dart')),
          Uri.parse('file:///bar/lib/bar.dart'));
      expect(config.resolve(pkg('baz', 'baz.dart')),
          Uri.parse('file:///tmp/lib/baz.dart'));
      expect(config.extraData, {
        'generator': 'pub',
        'other': [42]
      });
    });

    // Check that a few minimal configurations are valid.
    // These form the basis of invalid tests below.
    var cfg = '"configVersion":2';
    var pkgs = '"packages":[]';
    var name = '"name":"foo"';
    var root = '"rootUri":"/foo/"';
    test('minimal', () {
      var config = parsePackageConfigBytes(
          utf8.encode('{$cfg,$pkgs}') as Uint8List,
          Uri.parse('file:///tmp/.dart_tool/file.dart'),
          throwError);
      expect(config.version, 2);
      expect(config.packages, isEmpty);
    });
    test('minimal package', () {
      // A package must have a name and a rootUri, the remaining properties
      // are optional.
      var config = parsePackageConfigBytes(
          utf8.encode('{$cfg,"packages":[{$name,$root}]}') as Uint8List,
          Uri.parse('file:///tmp/.dart_tool/file.dart'),
          throwError);
      expect(config.version, 2);
      expect(config.packages.first.name, 'foo');
    });

    test('nested packages', () {
      var configBytes = utf8.encode(json.encode({
        'configVersion': 2,
        'packages': [
          {'name': 'foo', 'rootUri': '/foo/', 'packageUri': 'lib/'},
          {'name': 'bar', 'rootUri': '/foo/bar/', 'packageUri': 'lib/'},
          {'name': 'baz', 'rootUri': '/foo/bar/baz/', 'packageUri': 'lib/'},
          {'name': 'qux', 'rootUri': '/foo/qux/', 'packageUri': 'lib/'},
        ]
      }));
      var config = parsePackageConfigBytes(configBytes as Uint8List,
          Uri.parse('file:///tmp/.dart_tool/file.dart'), throwError);
      expect(config.version, 2);
      expect(config.packageOf(Uri.parse('file:///foo/lala/lala.dart'))!.name,
          'foo');
      expect(config.packageOf(Uri.parse('file:///foo/bar/lala.dart'))!.name,
          'bar');
      expect(config.packageOf(Uri.parse('file:///foo/bar/baz/lala.dart'))!.name,
          'baz');
      expect(config.packageOf(Uri.parse('file:///foo/qux/lala.dart'))!.name,
          'qux');
      expect(config.toPackageUri(Uri.parse('file:///foo/lib/diz')),
          Uri.parse('package:foo/diz'));
      expect(config.toPackageUri(Uri.parse('file:///foo/bar/lib/diz')),
          Uri.parse('package:bar/diz'));
      expect(config.toPackageUri(Uri.parse('file:///foo/bar/baz/lib/diz')),
          Uri.parse('package:baz/diz'));
      expect(config.toPackageUri(Uri.parse('file:///foo/qux/lib/diz')),
          Uri.parse('package:qux/diz'));
    });

    group('invalid', () {
      void testThrows(String name, String source) {
        test(name, () {
          expect(
              () => parsePackageConfigBytes(utf8.encode(source) as Uint8List,
                  Uri.parse('file:///tmp/.dart_tool/file.dart'), throwError),
              throwsA(TypeMatcher<FormatException>()));
        });
      }

      testThrows('comment', '# comment\n {$cfg,$pkgs}');
      testThrows('.packages file', 'foo:/foo\n');
      testThrows('no configVersion', '{$pkgs}');
      testThrows('no packages', '{$cfg}');
      group('config version:', () {
        testThrows('null', '{"configVersion":null,$pkgs}');
        testThrows('string', '{"configVersion":"2",$pkgs}');
        testThrows('array', '{"configVersion":[2],$pkgs}');
      });
      group('packages:', () {
        testThrows('null', '{$cfg,"packages":null}');
        testThrows('string', '{$cfg,"packages":"foo"}');
        testThrows('object', '{$cfg,"packages":{}}');
      });
      group('packages entry:', () {
        testThrows('null', '{$cfg,"packages":[null]}');
        testThrows('string', '{$cfg,"packages":["foo"]}');
        testThrows('array', '{$cfg,"packages":[[]]}');
      });
      group('package', () {
        testThrows('no name', '{$cfg,"packages":[{$root}]}');
        group('name:', () {
          testThrows('null', '{$cfg,"packages":[{"name":null,$root}]}');
          testThrows('num', '{$cfg,"packages":[{"name":1,$root}]}');
          testThrows('object', '{$cfg,"packages":[{"name":{},$root}]}');
          testThrows('empty', '{$cfg,"packages":[{"name":"",$root}]}');
          testThrows('one-dot', '{$cfg,"packages":[{"name":".",$root}]}');
          testThrows('two-dot', '{$cfg,"packages":[{"name":"..",$root}]}');
          testThrows(
              "invalid char '\\'", '{$cfg,"packages":[{"name":"\\",$root}]}');
          testThrows(
              "invalid char ':'", '{$cfg,"packages":[{"name":":",$root}]}');
          testThrows(
              "invalid char ' '", '{$cfg,"packages":[{"name":" ",$root}]}');
        });

        testThrows('no root', '{$cfg,"packages":[{$name}]}');
        group('root:', () {
          testThrows('null', '{$cfg,"packages":[{$name,"rootUri":null}]}');
          testThrows('num', '{$cfg,"packages":[{$name,"rootUri":1}]}');
          testThrows('object', '{$cfg,"packages":[{$name,"rootUri":{}}]}');
          testThrows('fragment', '{$cfg,"packages":[{$name,"rootUri":"x/#"}]}');
          testThrows('query', '{$cfg,"packages":[{$name,"rootUri":"x/?"}]}');
          testThrows('package-URI',
              '{$cfg,"packages":[{$name,"rootUri":"package:x/x/"}]}');
        });
        group('package-URI root:', () {
          testThrows(
              'null', '{$cfg,"packages":[{$name,$root,"packageUri":null}]}');
          testThrows('num', '{$cfg,"packages":[{$name,$root,"packageUri":1}]}');
          testThrows(
              'object', '{$cfg,"packages":[{$name,$root,"packageUri":{}}]}');
          testThrows('fragment',
              '{$cfg,"packages":[{$name,$root,"packageUri":"x/#"}]}');
          testThrows(
              'query', '{$cfg,"packages":[{$name,$root,"packageUri":"x/?"}]}');
          testThrows('package: URI',
              '{$cfg,"packages":[{$name,$root,"packageUri":"package:x/x/"}]}');
          testThrows('not inside root',
              '{$cfg,"packages":[{$name,$root,"packageUri":"../other/"}]}');
        });
        group('language version', () {
          testThrows('null',
              '{$cfg,"packages":[{$name,$root,"languageVersion":null}]}');
          testThrows(
              'num', '{$cfg,"packages":[{$name,$root,"languageVersion":1}]}');
          testThrows('object',
              '{$cfg,"packages":[{$name,$root,"languageVersion":{}}]}');
          testThrows('empty',
              '{$cfg,"packages":[{$name,$root,"languageVersion":""}]}');
          testThrows('non number.number',
              '{$cfg,"packages":[{$name,$root,"languageVersion":"x.1"}]}');
          testThrows('number.non number',
              '{$cfg,"packages":[{$name,$root,"languageVersion":"1.x"}]}');
          testThrows('non number',
              '{$cfg,"packages":[{$name,$root,"languageVersion":"x"}]}');
          testThrows('one number',
              '{$cfg,"packages":[{$name,$root,"languageVersion":"1"}]}');
          testThrows('three numbers',
              '{$cfg,"packages":[{$name,$root,"languageVersion":"1.2.3"}]}');
          testThrows('leading zero first',
              '{$cfg,"packages":[{$name,$root,"languageVersion":"01.1"}]}');
          testThrows('leading zero second',
              '{$cfg,"packages":[{$name,$root,"languageVersion":"1.01"}]}');
          testThrows('trailing-',
              '{$cfg,"packages":[{$name,$root,"languageVersion":"1.1-1"}]}');
          testThrows('trailing+',
              '{$cfg,"packages":[{$name,$root,"languageVersion":"1.1+1"}]}');
        });
      });
      testThrows('duplicate package name',
          '{$cfg,"packages":[{$name,$root},{$name,"rootUri":"/other/"}]}');
      testThrows('same roots',
          '{$cfg,"packages":[{$name,$root},{"name":"bar",$root}]}');
      testThrows(
          // The roots of foo and bar are the same.
          'same roots',
          '{$cfg,"packages":[{$name,$root},{"name":"bar",$root}]}');
      testThrows(
          // The root of bar is inside the root of foo,
          // but the package root of foo is inside the root of bar.
          'between root and lib',
          '{$cfg,"packages":['
              '{"name":"foo","rootUri":"/foo/","packageUri":"bar/lib/"},'
              '{"name":"bar","rootUri":"/foo/bar/"},"packageUri":"baz/lib"]}');
    });
  });

  group('factories', () {
    void testConfig(String name, PackageConfig config, PackageConfig expected) {
      group(name, () {
        test('structure', () {
          expect(config.version, expected.version);
          var expectedPackages = {for (var p in expected.packages) p.name};
          var actualPackages = {for (var p in config.packages) p.name};
          expect(actualPackages, expectedPackages);
        });
        for (var package in config.packages) {
          var name = package.name;
          test('package $name', () {
            var expectedPackage = expected[name]!;
            expect(expectedPackage, isNotNull);
            expect(package.root, expectedPackage.root, reason: 'root');
            expect(package.packageUriRoot, expectedPackage.packageUriRoot,
                reason: 'package root');
            expect(package.languageVersion, expectedPackage.languageVersion,
                reason: 'languageVersion');
          });
        }
      });
    }

    var configText = '''
     {"configVersion": 2, "packages": [
       {
         "name": "foo",
         "rootUri": "foo/",
         "packageUri": "bar/",
         "languageVersion": "1.2"
       }
     ]}
    ''';
    var baseUri = Uri.parse('file:///start/');
    var config = PackageConfig([
      Package('foo', Uri.parse('file:///start/foo/'),
          packageUriRoot: Uri.parse('file:///start/foo/bar/'),
          languageVersion: LanguageVersion(1, 2))
    ]);
    testConfig(
        'string', PackageConfig.parseString(configText, baseUri), config);
    testConfig(
        'bytes',
        PackageConfig.parseBytes(
            Uint8List.fromList(configText.codeUnits), baseUri),
        config);
    testConfig('json', PackageConfig.parseJson(jsonDecode(configText), baseUri),
        config);

    baseUri = Uri.parse('file:///start2/');
    config = PackageConfig([
      Package('foo', Uri.parse('file:///start2/foo/'),
          packageUriRoot: Uri.parse('file:///start2/foo/bar/'),
          languageVersion: LanguageVersion(1, 2))
    ]);
    testConfig(
        'string2', PackageConfig.parseString(configText, baseUri), config);
    testConfig(
        'bytes2',
        PackageConfig.parseBytes(
            Uint8List.fromList(configText.codeUnits), baseUri),
        config);
    testConfig('json2',
        PackageConfig.parseJson(jsonDecode(configText), baseUri), config);
  });
}
