// Copyright (c) 2016, 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 'package:expect/expect.dart';
import 'package:source_maps/source_maps.dart';
import 'tools/load.dart';
import 'tools/save.dart';
import 'package:compiler/src/util/memory_compiler.dart';

String SOURCEMAP = '''
{
  "version": 3,
  "file": "out.js",
  "sourceRoot": "",
  "sources":
      ["$sdkPath/_internal/compiler/js_lib/js_primitives.dart","hello_world.dart","$sdkPath/_internal/compiler/js_lib/internal_patch.dart"],
  "names": ["printString","main","printToConsole"],
  "mappings": "A;A;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;C;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;A;;eAoBAA;;;AAIIA;;;;AAOAA;;;AAKAA;;;AAMAA;;;GAOJA;;sC;;QC5CAC;;ICYEC;GDRFD;;;;A;A;A;;;A;;;A;A;A;A;A;A;A;;;;;;A;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;A;C;;;;;;;;;;;;;;;;;;;;;;;;;;;;A"
}''';

const String HUMAN_READABLE_SOURCE_MAP = '''
{
  "file": "out.js",
  "sourceRoot": "",
  "sources": {
    "0": "out.js.map",
    "1": "test.dart",
    "2": "out.js"
  },
  "lines": [
    {"target": "3,3-", "source": "1:2,17"},
    {"target": "4,3-", "source": "1:3,17"},
    {"target": "5,3-15", "source": "1:4,17"},
    {"target": "5,15-20", "source": "1:5,17"},
    {"target": "5,20-", "source": "1:6,4"},
    {"target": "6,3-", "source": "1:7,17"},
    {"target": "7,3-", "source": "1:8,17"},
    {"target": "8,1-", "source": "1:9,1"},
    {"target": "10,3-", "source": "1:11,17"},
    {"target": "11,3-", "source": "1:12,17"},
    {"target": "12,3-", "source": "1:13,17"},
    {"target": "13,3-", "source": "1:14,17"},
    {"target": "14,1-", "source": "1:15,4"}
  ]
}''';

void main() {
  testReadWrite();
  testWriteRead();
}

void testReadWrite() {
  SingleMapping sourceMap = SingleMapping.fromJson(json.decode(SOURCEMAP));
  String humanReadable = convertToHumanReadableSourceMap(sourceMap);
  SingleMapping sourceMap2 = convertFromHumanReadableSourceMap(humanReadable);
  String humanReadable2 = convertToHumanReadableSourceMap(sourceMap2);
  SingleMapping sourceMap3 = convertFromHumanReadableSourceMap(humanReadable2);
  String humanReadable3 = convertToHumanReadableSourceMap(sourceMap3);

  // Target line entries without sourceUrl are removed.
  //Expect.deepEquals(sourceMap.toJson(), sourceMap2.toJson());
  Expect.deepEquals(sourceMap2.toJson(), sourceMap3.toJson());
  Expect.deepEquals(json.decode(humanReadable), json.decode(humanReadable2));
  Expect.deepEquals(json.decode(humanReadable2), json.decode(humanReadable3));
}

void testWriteRead() {
  SingleMapping sourceMap = convertFromHumanReadableSourceMap(
    HUMAN_READABLE_SOURCE_MAP,
  );
  print(sourceMap);
  String humanReadable = convertToHumanReadableSourceMap(sourceMap);
  print(humanReadable);
  SingleMapping sourceMap2 = convertFromHumanReadableSourceMap(humanReadable);
  Expect.deepEquals(
    json.decode(HUMAN_READABLE_SOURCE_MAP),
    json.decode(humanReadable),
  );
  Expect.deepEquals(sourceMap.toJson(), sourceMap2.toJson());
}
