// Copyright (c) 2016, 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.src.task.yaml_test;

import 'package:analyzer/src/generated/source.dart';
import 'package:analyzer/src/task/yaml.dart';
import 'package:analyzer/task/general.dart';
import 'package:analyzer/task/yaml.dart';
import 'package:unittest/unittest.dart';
import 'package:yaml/yaml.dart';

import '../../reflective_tests.dart';
import '../../utils.dart';
import '../context/abstract_context.dart';

main() {
  initializeTestEnvironment();
  runReflectiveTests(ParseYamlTaskTest);
}

isInstanceOf isParseYamlTask = new isInstanceOf<ParseYamlTask>();

@reflectiveTest
class ParseYamlTaskTest extends AbstractContextTest {
  Source source;

  test_perform() {
    _performParseTask(r'''
rules:
  style_guide:
    camel_case_types: false
''');
    expect(outputs, hasLength(3));
    YamlDocument document = outputs[YAML_DOCUMENT];
    expect(document, isNotNull);
    var value = document.contents.value;
    expect(value, new isInstanceOf<Map>());
    expect(value['rules']['style_guide']['camel_case_types'], isFalse);
    expect(outputs[YAML_ERRORS], hasLength(0));
    LineInfo lineInfo = outputs[LINE_INFO];
    expect(lineInfo, isNotNull);
    expect(lineInfo.getOffsetOfLine(0), 0);
    expect(lineInfo.getOffsetOfLine(1), 7);
    expect(lineInfo.getOffsetOfLine(2), 22);
    expect(lineInfo.getOffsetOfLine(3), 50);
  }

  test_perform_doesNotExist() {
    _performParseTask(null);
    expect(outputs, hasLength(3));
    YamlDocument document = outputs[YAML_DOCUMENT];
    expect(document, isNotNull);
    expect(document.contents.value, isNull);
    expect(outputs[YAML_ERRORS], hasLength(1));
    LineInfo lineInfo = outputs[LINE_INFO];
    expect(lineInfo, isNotNull);
    expect(lineInfo.getOffsetOfLine(0), 0);
  }

  void _performParseTask(String content) {
    if (content == null) {
      source = resourceProvider.getFile('/test.yaml').createSource();
    } else {
      source = newSource('/test.yaml', content);
    }
    computeResult(source, YAML_DOCUMENT, matcher: isParseYamlTask);
  }
}
