// Copyright (c) 2019, 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.

import 'dart:convert';

import 'package:source_span/source_span.dart';
import 'package:test/test.dart';
import 'package:yaml/yaml.dart';

void _expectSpan(SourceSpan source, String expected) {
  final result = source.message('message');
  printOnFailure("r'''\n$result'''");

  expect(result, expected);
}

void main() {
  YamlMap yaml;

  setUpAll(() {
    yaml = loadYaml(const JsonEncoder.withIndent(' ').convert({
      'num': 42,
      'nested': {
        'null': null,
        'num': 42,
      },
      'null': null,
    })) as YamlMap;
  });

  test('first root key', () {
    _expectSpan(
      yaml.nodes['num'].span,
      r'''
line 2, column 9: message
  ╷
2 │  "num": 42,
  │         ^^
  ╵''',
    );
  });

  test('first root key', () {
    _expectSpan(
      yaml.nodes['null'].span,
      r'''
line 7, column 10: message
  ╷
7 │  "null": null
  │          ^^^^
  ╵''',
    );
  });

  group('nested', () {
    YamlMap nestedMap;

    setUpAll(() {
      nestedMap = yaml.nodes['nested'] as YamlMap;
    });

    test('first root key', () {
      _expectSpan(
        nestedMap.nodes['null'].span,
        r'''
line 4, column 11: message
  ╷
4 │   "null": null,
  │           ^^^^
  ╵''',
      );
    });

    test('first root key', () {
      _expectSpan(
        nestedMap.nodes['num'].span,
        r'''
line 5, column 10: message
  ╷
5 │     "num": 42
  │ ┌──────────^
6 │ │  },
  │ └─^
  ╵''',
      );
    });
  });

  group('block', () {
    YamlList list, nestedList;

    setUpAll(() {
      const yamlStr = '''
- foo
- 
  - one
  - 
  - three
  - 
  - five
  -
- 
  a : b
  c : d
- bar
''';

      list = loadYaml(yamlStr) as YamlList;
      nestedList = list.nodes[1] as YamlList;
    });

    test('root nodes span', () {
      _expectSpan(list.nodes[0].span, r'''
line 1, column 3: message
  ╷
1 │ - foo
  │   ^^^
  ╵''');

      _expectSpan(list.nodes[1].span, r'''
line 3, column 3: message
  ╷
3 │ ┌   - one
4 │ │   - 
5 │ │   - three
6 │ │   - 
7 │ │   - five
8 │ └   -
  ╵''');

      _expectSpan(list.nodes[2].span, r'''
line 10, column 3: message
   ╷
10 │ ┌   a : b
11 │ └   c : d
   ╵''');

      _expectSpan(list.nodes[3].span, r'''
line 12, column 3: message
   ╷
12 │ - bar
   │   ^^^
   ╵''');
    });

    test('null nodes span', () {
      _expectSpan(nestedList.nodes[1].span, r'''
line 4, column 3: message
  ╷
4 │   - 
  │   ^
  ╵''');

      _expectSpan(nestedList.nodes[3].span, r'''
line 6, column 3: message
  ╷
6 │   - 
  │   ^
  ╵''');

      _expectSpan(nestedList.nodes[5].span, r'''
line 8, column 3: message
  ╷
8 │   -
  │   ^
  ╵''');
    });
  });
}
