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

import '../data/tables/todos.dart';
import '../data/utils/expect_equality.dart';

void main() {
  final expression = GeneratedIntColumn('col', null, false);
  final db = TodoDb(null);

  final comparisons = {
    expression.isSmallerThan: '<',
    expression.isSmallerOrEqual: '<=',
    expression.isBiggerOrEqual: '>=',
    expression.isBiggerThan: '>'
  };

  final comparisonsVal = {
    expression.isSmallerThanValue: '<',
    expression.isSmallerOrEqualValue: '<=',
    expression.isBiggerOrEqualValue: '>=',
    expression.isBiggerThanValue: '>'
  };

  group('can compare with other expressions', () {
    final compare = GeneratedIntColumn('compare', null, false);

    comparisons.forEach((fn, value) {
      test('for operator $value', () {
        final ctx = GenerationContext.fromDb(db);

        fn(compare).writeInto(ctx);

        expect(ctx.sql, 'col $value compare');

        expectEquals(fn(compare), fn(compare));
      });
    });
  });

  group('can compare with values', () {
    comparisonsVal.forEach((fn, value) {
      test('for operator $value', () {
        final ctx = GenerationContext.fromDb(db);

        fn(12).writeInto(ctx);

        expect(ctx.sql, 'col $value ?');
        expect(ctx.boundVariables, [12]);
      });
    });
  });

  group('between', () {
    test('other expressions', () {
      final low = GeneratedIntColumn('low', null, false);
      final high = GeneratedIntColumn('high', null, false);

      final ctx = GenerationContext.fromDb(db);
      expression.isBetween(low, high).writeInto(ctx);

      expect(ctx.sql, 'col BETWEEN low AND high');
    });

    test('values', () {
      final ctx = GenerationContext.fromDb(db);
      expression.isBetweenValues(3, 15).writeInto(ctx);

      expect(ctx.sql, 'col BETWEEN ? AND ?');
      expect(ctx.boundVariables, [3, 15]);
    });
  });
}
