// 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 'dart:async';

import 'package:barback/barback.dart';
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", () {
    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.blub", "app|foo.blab"]);
    buildShouldSucceed();
  });

  test("includes overwritten outputs", () {
    initGraph(["app|a.txt", "app|foo.blub"], {"app": [
      [new RewriteTransformer("blub", "blub")]
    ]});
    updateSources(["app|a.txt", "app|foo.blub"]);
    expectAllAssets({
      "app|a.txt": "a",
      "app|foo.blub": "foo.blub"
    });
    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))
    ]));
  });

  // Regression test.
  test("getAllAssets() is called synchronously after after initializing "
      "barback", () {
    var provider = new MockProvider({
      "app|a.txt": "a",
      "app|b.txt": "b",
      "app|c.txt": "c"
    });
    var barback = new Barback(provider);
    barback.updateSources([
      new AssetId.parse("app|a.txt"),
      new AssetId.parse("app|b.txt"),
      new AssetId.parse("app|c.txt")
    ]);

    expect(barback.getAllAssets().then((assets) {
      return Future.wait(assets.map((asset) => asset.readAsString()));
    }), completion(unorderedEquals(["a", "b", "c"])));
  });
}
