// Copyright 2020 The Fuchsia Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

// TODO(https://fxbug.dev/84961): Fix null safety and remove this language version.
// @dart=2.9

import 'package:dart_strict_deps_lib/file_processor.dart';
import 'package:test/test.dart';
import 'package:tools.dart-strict-deps.dart_strict_deps_proto/protos/models.pb.dart';

void main() {
  test('Read empty json to BuildInfo succeeds', () {
    var json = '[]';
    BuildInfo buildInfo = buildInfoFromJson(json);
    expect(buildInfo.buildTargets, isEmpty);
  });

  test('Read invalid json fails', () {
    var json = 'invalidJson';
    expect(() => buildInfoFromJson(json), throwsFormatException);
  });

  test('Read valid json to BuildInfo same as expected', () {
    var json = '''
      [
        {
          "__package_name": "test1",
          "__public_deps": ["a", "b"],
          "__deps": ["c"],
          "__rebased_sources": ["d"],
          "__is_current_target": true
        },
        {
          "__package_name": "test2",
          "__public_deps": ["e"],
          "__deps": ["f"],
          "__rebased_sources": ["g"],
          "__is_current_target": false
        }
      ]
      ''';

    BuildTarget test1 = BuildTarget()
      ..packageName = 'test1'
      ..publicDeps.addAll(['a', 'b'])
      ..deps.add('c')
      ..rebasedSources.add('d')
      ..isCurrentTarget = true;
    BuildTarget test2 = BuildTarget()
      ..packageName = 'test2'
      ..publicDeps.add('e')
      ..deps.add('f')
      ..rebasedSources.add('g')
      ..isCurrentTarget = false;
    BuildInfo expectedBuildInfo = BuildInfo()
      ..buildTargets.addAll([test1, test2]);
    BuildInfo buildInfo = buildInfoFromJson(json);
    expect(buildInfo, expectedBuildInfo);
  });
}
