// Copyright 2020 The Fuchsia Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

import 'package:test/test.dart';
import 'package:codesize/queries/index.dart';
import 'package:codesize/reflect.dart';
import 'package:codesize/types.dart';

// ignore_for_file: avoid_as

class Foo extends Query {
  @override
  void addReport(Report report) {}

  @override
  QueryReport distill() {
    throw UnimplementedError();
  }

  @override
  void mergeWith(Iterable<Query> others) {}

  @override
  String getDescription() {
    throw UnimplementedError();
  }
}

class FooOneIntArg extends Foo {
  FooOneIntArg({int a = 42}) : _a = a;
  final int _a;
}

class FooOneStringArg extends Foo {
  FooOneStringArg({String s = '42'}) : _s = s;
  final String _s;
}

class FooBoolStringArg extends Foo {
  FooBoolStringArg({bool b = false, String s = '42'})
      : _b = b,
        _s = s;
  final bool _b;
  final String _s;
}

void main() {
  group('ReflectQuery', () {
    test('Construct Foo()', () {
      final result = ReflectQuery.instantiate(
          const QueryFactory(Foo, ''), <String, String>{});
      expect(result, isA<Foo>());
    });

    test('Construct FooOneIntArg(a: 100)', () {
      final result = ReflectQuery.instantiate(
          const QueryFactory(FooOneIntArg, ''), <String, String>{'a': '100'});
      expect(result, isA<FooOneIntArg>());
      expect((result as FooOneIntArg)._a, equals(100));
    });

    test('Construct FooOneStringArg(s: 100)', () {
      final result = ReflectQuery.instantiate(
          const QueryFactory(FooOneStringArg, ''),
          <String, String>{'s': '100'});
      expect(result, isA<FooOneStringArg>());
      expect((result as FooOneStringArg)._s, equals('100'));
    });

    test('Construct FooBoolStringArg(b: false, s: 100)', () {
      final result = ReflectQuery.instantiate(
          const QueryFactory(FooBoolStringArg, ''),
          <String, String>{'b': 'true'});
      expect(result, isA<FooBoolStringArg>());
      expect((result as FooBoolStringArg)._b, equals(true));
      expect((result as FooBoolStringArg)._s, equals('42'));
    });
  });
}
