// 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.

@TestOn('browser')

import 'dart:html';

import 'package:test/test.dart';
import 'package:path/path.dart' as path;

main() {
  group('new Context()', () {
    test('uses the window location if root and style are omitted', () {
      var context = new path.Context();
      expect(context.current,
          Uri.parse(window.location.href).resolve('.').toString());
    });

    test('uses "." if root is omitted', () {
      var context = new path.Context(style: path.Style.platform);
      expect(context.current, ".");
    });

    test('uses the host platform if style is omitted', () {
      var context = new path.Context();
      expect(context.style, path.Style.platform);
    });
  });

  test('Style.platform is url', () {
    expect(path.Style.platform, path.Style.url);
  });

  test('current', () {
    expect(
        path.current, Uri.parse(window.location.href).resolve('.').toString());
  });
}
