// 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 polymer.test.transform.script_compactor_test;

import 'package:polymer/src/transform/script_compactor.dart';
import 'package:unittest/compact_vm_config.dart';

import 'common.dart';

void main() {
  useCompactVMConfiguration();

  testPhases('no changes', [[new ScriptCompactor()]], {
      'a|web/test.html': '<!DOCTYPE html><html></html>',
    }, {
      'a|web/test.html': '<!DOCTYPE html><html></html>',
    });

  testPhases('no changes outside web/', [[new ScriptCompactor()]], {
      'a|lib/test.html':
          '<!DOCTYPE html><html><head>'
          '<script type="application/dart" src="a.dart"></script>',
    }, {
      'a|lib/test.html':
          '<!DOCTYPE html><html><head>'
          '<script type="application/dart" src="a.dart"></script>',
    });

  testPhases('single script', [[new ScriptCompactor()]], {
      'a|web/test.html':
          '<!DOCTYPE html><html><head>'
          '<script type="application/dart" src="a.dart"></script>',
    }, {
      'a|web/test.html':
          '<!DOCTYPE html><html><head></head><body>'
          '<script type="application/dart" '
          'src="test.html_bootstrap.dart"></script>'
          '<script src="packages/browser/dart.js"></script>'
          '</body></html>',

      'a|web/test.html_bootstrap.dart':
          '''library app_bootstrap;

          import 'package:polymer/polymer.dart';
          import 'dart:mirrors' show currentMirrorSystem;

          import 'a.dart' as i0;

          void main() {
            initPolymer([
                'a.dart',
              ], currentMirrorSystem().isolate.rootLibrary.uri.toString());
          }
          '''.replaceAll('\n          ', '\n'),
    });

  testPhases('several scripts', [[new ScriptCompactor()]], {
      'a|web/test.html':
          '<!DOCTYPE html><html><head>'
          '<script type="application/dart" src="a.dart"></script>'
          '<script type="application/dart" src="b.dart"></script>'
          '</head><body><div>'
          '<script type="application/dart" src="c.dart"></script>'
          '</div>'
          '<script type="application/dart" src="d.dart"></script>',
    }, {
      'a|web/test.html':
          '<!DOCTYPE html><html><head></head><body><div></div>'
          '<script type="application/dart" '
          'src="test.html_bootstrap.dart"></script>'
          '<script src="packages/browser/dart.js"></script>'
          '</body></html>',

      'a|web/test.html_bootstrap.dart':
          '''library app_bootstrap;

          import 'package:polymer/polymer.dart';
          import 'dart:mirrors' show currentMirrorSystem;

          import 'a.dart' as i0;
          import 'b.dart' as i1;
          import 'c.dart' as i2;
          import 'd.dart' as i3;

          void main() {
            initPolymer([
                'a.dart',
                'b.dart',
                'c.dart',
                'd.dart',
              ], currentMirrorSystem().isolate.rootLibrary.uri.toString());
          }
          '''.replaceAll('\n          ', '\n'),
    });
}
