// Copyright (c) 2013, 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.

library barback.test.barback_test;

import 'package:scheduled_test/scheduled_test.dart';

import '../utils.dart';

main() {
  initConfig();

  test("gets all source assets", () {
    initGraph(["app|a.txt", "app|b.txt", "app|c.txt"]);
    updateSources(["app|a.txt", "app|b.txt", "app|c.txt"]);
    expectAllAssets(["app|a.txt", "app|b.txt", "app|c.txt"]);
    buildShouldSucceed();
  });

  test("includes transformed outputs, but not consumed ones", () {
    initGraph(["app|a.txt", "app|foo.blub"], {"app": [
      [new RewriteTransformer("blub", "blab")]
    ]});
    updateSources(["app|a.txt", "app|foo.blub"]);
    expectAllAssets(["app|a.txt", "app|foo.blab"]);
    buildShouldSucceed();
  });

  test("includes non-primary inputs to transformers", () {
    var transformer = new ManyToOneTransformer("txt");
    initGraph({
      "app|a.txt": "a.inc",
      "app|a.inc": "a"
    }, {"app": [[transformer]]});

    updateSources(["app|a.txt", "app|a.inc"]);
    expectAllAssets(["app|a.inc", "app|a.out"]);
    buildShouldSucceed();
  });

  test("completes to an error if two transformers output the same file", () {
    initGraph(["app|foo.a"], {"app": [
      [
        new RewriteTransformer("a", "b"),
        new RewriteTransformer("a", "b")
      ]
    ]});
    updateSources(["app|foo.a"]);
    expectAllAssetsShouldFail(isAssetCollisionException("app|foo.b"));
  });

  test("completes to an error if a transformer fails", () {
    initGraph(["app|foo.txt"], {"app": [
      [new BadTransformer(["app|foo.out"])]
    ]});

    updateSources(["app|foo.txt"]);
    expectAllAssetsShouldFail(isTransformerException(
        equals(BadTransformer.ERROR)));
  });

  test("completes to an aggregate error if there are multiple errors", () {
    initGraph(["app|foo.txt"], {"app": [
      [
        new BadTransformer(["app|foo.out"]),
        new BadTransformer(["app|foo.out2"])
      ]
    ]});

    updateSources(["app|foo.txt"]);
    expectAllAssetsShouldFail(isAggregateException([
      isTransformerException(equals(BadTransformer.ERROR)),
      isTransformerException(equals(BadTransformer.ERROR))
    ]));
  });
}
