import 'package:belatuk_code_buffer/belatuk_code_buffer.dart';
import 'package:file/file.dart';
import 'package:file/memory.dart';
import 'package:jael3/jael3.dart' as jael;
import 'package:jael3_preprocessor/jael3_preprocessor.dart' as jael;
import 'package:belatuk_symbol_table/belatuk_symbol_table.dart';
import 'package:test/test.dart';

void main() {
  late FileSystem fileSystem;

  setUp(() {
    fileSystem = MemoryFileSystem();

    // a.jl
    fileSystem.file('a.jl').writeAsStringSync('<b>a.jl</b>');

    // b.jl
    fileSystem.file('b.jl').writeAsStringSync('<i><include src="a.jl"></i>');

    // c.jl
    fileSystem.file('c.jl').writeAsStringSync('<u><include src="b.jl"></u>');
  });

  test('includes are expanded', () async {
    var file = fileSystem.file('c.jl');
    var original = jael.parseDocument(await file.readAsString(),
        sourceUrl: file.uri, onError: (e) => throw e)!;
    var processed = await jael.resolveIncludes(original,
        fileSystem.directory(fileSystem.currentDirectory), (e) => throw e);
    var buf = CodeBuffer();
    var scope = SymbolTable();
    const jael.Renderer().render(processed!, buf, scope);
    print(buf);

    expect(
        buf.toString(),
        '''
<u>
  <i>
    <b>
      a.jl
    </b>
  </i>
</u>
'''
            .trim());
  });
}