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

// ignore_for_file: non_constant_identifier_names

import 'package:api_summary/src/node.dart';
import 'package:test/test.dart';
import 'package:test_reflective_loader/test_reflective_loader.dart';

void main() {
  defineReflectiveSuite(() {
    defineReflectiveTests(NodeTest);
  });
}

@reflectiveTest
class NodeTest {
  void test_printNodes_indentChildNodes() {
    final buf = StringBuffer();
    printNodes(buf, [
      (
        1,
        _SimpleNode('one', [
          (2, _SimpleNode('two')),
          (3, _SimpleNode('three')),
        ]),
      ),
      (
        4,
        _SimpleNode('four', [
          (5, _SimpleNode('five')),
          (6, _SimpleNode('six')),
        ]),
      ),
    ]);
    expect(buf.toString(), '''
one
  two
  three
four
  five
  six
''');
  }

  void test_printNodes_joinTextStrings() {
    final buf = StringBuffer();
    printNodes(buf, [
      (1, Node<num>()..text.addAll(['x', 0])),
    ]);
    expect(buf.toString(), '''
x0
''');
  }

  void test_printNodes_sortChildNodesByKey() {
    final buf = StringBuffer();
    printNodes(buf, [
      (
        0,
        _SimpleNode('zero', [
          (2, _SimpleNode('two')),
          (1, _SimpleNode('one')),
          (3, _SimpleNode('three')),
        ]),
      ),
    ]);
    expect(buf.toString(), '''
zero
  one
  two
  three
''');
  }

  void test_printNodes_sortedByKey() {
    final buf = StringBuffer();
    printNodes(buf, [
      (2, _SimpleNode('two')),
      (1, _SimpleNode('one')),
      (3, _SimpleNode('three')),
    ]);
    expect(buf.toString(), '''
one
two
three
''');
  }
}

class _SimpleNode extends Node<num> {
  _SimpleNode(String text, [List<(num, Node<num>)> childNodes = const []]) {
    this.text.add(text);
    this.childNodes.addAll(childNodes);
  }
}
