import 'dart:math';
import 'package:code_buffer/code_buffer.dart';
import 'package:jael/jael.dart' as jael;
import 'package:symbol_table/symbol_table.dart';
import 'package:test/test.dart';

void main() {
  test('render into div', () {
    var template = '''
    <div>
      <element name="square-root">
        The square root of {{ n }} is {{ sqrt(n).toInt() }}.
      </element>
      <square-root @n=16 />
    </div>
    ''';

    var html = render(template, {'sqrt': sqrt});
    print(html);

    expect(
        html,
        '''
<div>
  <div>
    The square root of 16 is 4.
  </div>
</div>
    '''
            .trim());
  });

  test('render into explicit tag name', () {
    var template = '''
    <div>
      <element name="square-root">
        The square root of {{ n }} is {{ sqrt(n).toInt() }}.
      </element>
      <square-root as="span" @n=16 />
    </div>
    ''';

    var html = render(template, {'sqrt': sqrt});
    print(html);

    expect(
        html,
        '''
<div>
  <span>
    The square root of 16 is 4.
  </span>
</div>
    '''
            .trim());
  });

  test('pass attributes', () {
    var template = '''
    <div>
      <element name="square-root">
        The square root of {{ n }} is {{ sqrt(n).toInt() }}.
      </element>
      <square-root foo="bar" baz="quux" @n=16 />
    </div>
    ''';

    var html = render(template, {'sqrt': sqrt});
    print(html);

    expect(
        html,
        '''
<div>
  <div foo="bar" baz="quux">
    The square root of 16 is 4.
  </div>
</div>
    '''
            .trim());
  });

  test('render without tag name', () {
    var template = '''
    <div>
      <element name="square-root">
        The square root of {{ n }} is {{ sqrt(n).toInt() }}.
      </element>
      <square-root as=false @n=16 />
    </div>
    ''';

    var html = render(template, {'sqrt': sqrt});
    print(html);

    expect(
        html,
        '''
<div>
  The square root of 16 is 4.
      
</div>
    '''
            .trim());
  });
}

String render(String template, [Map<String, dynamic> values = const {}]) {
  var doc = jael.parseDocument(template, onError: (e) => throw e)!;
  var buffer = CodeBuffer();
  const jael.Renderer().render(doc, buffer, SymbolTable(values: values));
  return buffer.toString();
}