// Copyright (c) 2013, the Dart project authors.  Please see the AUTHORS d.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 pub_tests;

import '../descriptor.dart' as d;
import '../test_pub.dart';
import '../serve/utils.dart';

const TRANSFORMER = """
import 'dart:async';

import 'package:barback/barback.dart';

class RewriteTransformer extends Transformer {
  RewriteTransformer.asPlugin();

  String get allowedExtensions => '.txt';

  Future apply(Transform transform) {
    return transform.readInput(transform.primaryInput.id).toList()
        .then((contents) {
      var id = transform.primaryInput.id.changeExtension(".out");
      var asset = new Asset.fromString(id, "\$contents.out");
      transform.addOutput(asset);
    });
  }
}
""";

main() {
  initConfig();
  integration("a transform can use readInputAsString", () {
    d.dir(appPath, [
      d.pubspec({
        "name": "myapp",
        "transformers": ["myapp/src/transformer"]
      }),
      d.dir("lib", [d.dir("src", [
        d.file("transformer.dart", TRANSFORMER)
      ])]),
      d.dir("web", [
        d.file("foo.txt", "foo")
      ])
    ]).create();

    createLockFile('myapp', pkg: ['barback']);

    startPubServe();
    requestShouldSucceed("foo.out", "[[102, 111, 111]].out");
    endPubServe();
  });
}
