import 'package:test/test.dart';
import 'common.dart';

main() {
  test('variables', () {
    expect(r'$a', isVariable('a'));
    expect(r'$abc', isVariable('abc'));
    expect(r'$abc123', isVariable('abc123'));
    expect(r'$_', isVariable('_'));
    expect(r'$___', isVariable('___'));
    expect(r'$_123', isVariable('_123'));
  });

  test('exceptions', () {
    expect(() => parse(r'$').parseVariable(), throwsSyntaxError);
  });
}

Matcher isVariable(String name) => new _IsVariable(name);

class _IsVariable extends Matcher {
  final String name;

  _IsVariable(this.name);

  @override
  Description describe(Description description) {
    return description.add('parses as a variable named "$name"');
  }

  @override
  bool matches(item, Map matchState) {
    var p = parse(item.toString());
    var v = p.parseVariable();
    return equals(name).matches(v?.name, matchState);
  }
}
