// 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 options_test;

import 'package:unittest/unittest.dart';
//import 'package:analyzer_experimental/options.dart';

main() {

  group('AnalyzerOptions.parse()', () {

    test('defaults', () {
//      CommandLineOptions options = CommandLineOptions.parse(['foo.dart']);
//      expect(options, isNotNull);
//      expect(options.shouldBatch, isFalse);
//      expect(options.machineFormat, isFalse);
//      expect(options.ignoreUnrecognizedFlags, isFalse);
//      expect(options.showPackageWarnings, isFalse);
//      expect(options.showSdkWarnings, isFalse);
//      expect(options.warningsAreFatal, isFalse);
//      expect(options.dartSdkPath, isNull);
//      expect(options.sourceFiles, equals(['foo.dart']));
    });

//    test('notice unrecognized flags', () {
//      CommandLineOptions options = new CommandLineOptions.parse(['--bar', '--baz',
//        'foo.dart']);
//      expect(options, isNull);
//    });
//
//    test('ignore unrecognized flags', () {
//      CommandLineOptions options = new CommandLineOptions.parse([
//        '--ignore_unrecognized_flags', '--bar', '--baz', 'foo.dart']);
//      expect(options, isNotNull);
//      expect(options.sourceFiles, equals(['foo.dart']));
//    });

  });

}

