// Copyright (c) 2014, 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 analyzer.test.generated.java_io_test;

import 'package:analyzer/src/generated/java_io.dart';
import 'package:path/path.dart' as path;
import 'package:test/test.dart';

main() {
  group('JavaFile', () {
    group('toURI', () {
      test('forAbsolute', () {
        String tempPath = '/temp';
        String absolutePath = path.context.join(tempPath, 'foo.dart');
        // we use an absolute path
        expect(path.context.isAbsolute(absolutePath), isTrue,
            reason: '"$absolutePath" is not absolute');
        // test that toURI() returns an absolute URI
        Uri uri = new JavaFile(absolutePath).toURI();
        expect(uri.isAbsolute, isTrue);
        expect(uri.scheme, 'file');
      });
      test('forRelative', () {
        String tempPath = '/temp';
        String absolutePath = path.context.join(tempPath, 'foo.dart');
        expect(path.context.isAbsolute(absolutePath), isTrue,
            reason: '"$absolutePath" is not absolute');
        // prepare a relative path
        // We should not check that "relPath" is actually relative -
        // it may be not on Windows, if "temp" is on other disk.
        String relPath = path.context.relative(absolutePath);
        // test that toURI() returns an absolute URI
        Uri uri = new JavaFile(relPath).toURI();
        expect(uri.isAbsolute, isTrue);
        expect(uri.scheme, 'file');
      });
    });
  });
}
