// Copyright (c) 2016, the Dart project authors. Please see the AUTHORS file
// for details. 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:analyzer/src/dart/element/element.dart';
import 'package:analyzer/src/summary/format.dart';
import 'package:analyzer/src/summary/name_filter.dart';
import 'package:test/test.dart';
import 'package:test_reflective_loader/test_reflective_loader.dart';

main() {
  defineReflectiveSuite(() {
    defineReflectiveTests(NameFilterTest);
  });
}

@reflectiveTest
class NameFilterTest {
  test_accepts_accessors_hide() {
    NameFilter filter = new NameFilter.forUnlinkedCombinator(
        new UnlinkedCombinatorBuilder(hides: ['bar']));
    expect(filter.accepts('foo'), isTrue);
    expect(filter.accepts('foo='), isTrue);
    expect(filter.accepts('bar'), isFalse);
    expect(filter.accepts('bar='), isFalse);
  }

  test_accepts_accessors_show() {
    NameFilter filter = new NameFilter.forUnlinkedCombinator(
        new UnlinkedCombinatorBuilder(shows: ['foo']));
    expect(filter.accepts('foo'), isTrue);
    expect(filter.accepts('foo='), isTrue);
    expect(filter.accepts('bar'), isFalse);
    expect(filter.accepts('bar='), isFalse);
  }

  test_forNamespaceCombinator_hide() {
    NameFilter filter = new NameFilter.forNamespaceCombinator(
        new HideElementCombinatorImpl()..hiddenNames = ['foo', 'bar']);
    expect(filter.accepts('foo'), isFalse);
    expect(filter.accepts('bar'), isFalse);
    expect(filter.accepts('baz'), isTrue);
    expect(filter.shownNames, isNull);
    expect(filter.hiddenNames, isNotNull);
    expect(filter.hiddenNames, ['foo', 'bar'].toSet());
  }

  test_forNamespaceCombinator_show() {
    NameFilter filter = new NameFilter.forNamespaceCombinator(
        new ShowElementCombinatorImpl()..shownNames = ['foo', 'bar']);
    expect(filter.accepts('foo'), isTrue);
    expect(filter.accepts('bar'), isTrue);
    expect(filter.accepts('baz'), isFalse);
    expect(filter.hiddenNames, isNull);
    expect(filter.shownNames, isNotNull);
    expect(filter.shownNames, ['foo', 'bar'].toSet());
  }

  test_forNamespaceCombinators() {
    NameFilter filter = new NameFilter.forNamespaceCombinators([
      new HideElementCombinatorImpl()..hiddenNames = ['foo'],
      new HideElementCombinatorImpl()..hiddenNames = ['bar']
    ]);
    expect(filter.accepts('foo'), isFalse);
    expect(filter.accepts('bar'), isFalse);
    expect(filter.accepts('baz'), isTrue);
    expect(filter.shownNames, isNull);
    expect(filter.hiddenNames, isNotNull);
    expect(filter.hiddenNames, ['foo', 'bar'].toSet());
  }

  test_forUnlinkedCombinator_hide() {
    NameFilter filter = new NameFilter.forUnlinkedCombinator(
        new UnlinkedCombinatorBuilder(hides: ['foo', 'bar']));
    expect(filter.accepts('foo'), isFalse);
    expect(filter.accepts('bar'), isFalse);
    expect(filter.accepts('baz'), isTrue);
    expect(filter.shownNames, isNull);
    expect(filter.hiddenNames, isNotNull);
    expect(filter.hiddenNames, ['foo', 'bar'].toSet());
  }

  test_forUnlinkedCombinator_show() {
    NameFilter filter = new NameFilter.forUnlinkedCombinator(
        new UnlinkedCombinatorBuilder(shows: ['foo', 'bar']));
    expect(filter.accepts('foo'), isTrue);
    expect(filter.accepts('bar'), isTrue);
    expect(filter.accepts('baz'), isFalse);
    expect(filter.hiddenNames, isNull);
    expect(filter.shownNames, isNotNull);
    expect(filter.shownNames, ['foo', 'bar'].toSet());
  }

  test_forUnlinkedCombinators() {
    NameFilter filter = new NameFilter.forUnlinkedCombinators([
      new UnlinkedCombinatorBuilder(hides: ['foo']),
      new UnlinkedCombinatorBuilder(hides: ['bar'])
    ]);
    expect(filter.accepts('foo'), isFalse);
    expect(filter.accepts('bar'), isFalse);
    expect(filter.accepts('baz'), isTrue);
    expect(filter.shownNames, isNull);
    expect(filter.hiddenNames, isNotNull);
    expect(filter.hiddenNames, ['foo', 'bar'].toSet());
  }

  test_identity() {
    expect(NameFilter.identity.accepts('foo'), isTrue);
    expect(NameFilter.identity.hiddenNames, isNotNull);
    expect(NameFilter.identity.hiddenNames, isEmpty);
    expect(NameFilter.identity.shownNames, isNull);
  }

  test_merge_hides_hides() {
    NameFilter filter = new NameFilter.forUnlinkedCombinator(
            new UnlinkedCombinatorBuilder(hides: ['foo']))
        .merge(new NameFilter.forUnlinkedCombinator(
            new UnlinkedCombinatorBuilder(hides: ['bar'])));
    expect(filter.accepts('foo'), isFalse);
    expect(filter.accepts('bar'), isFalse);
    expect(filter.accepts('baz'), isTrue);
    expect(filter.shownNames, isNull);
    expect(filter.hiddenNames, isNotNull);
    expect(filter.hiddenNames, ['foo', 'bar'].toSet());
  }

  test_merge_hides_identity() {
    NameFilter filter = new NameFilter.forUnlinkedCombinator(
            new UnlinkedCombinatorBuilder(hides: ['foo', 'bar']))
        .merge(NameFilter.identity);
    expect(filter.accepts('foo'), isFalse);
    expect(filter.accepts('bar'), isFalse);
    expect(filter.accepts('baz'), isTrue);
    expect(filter.shownNames, isNull);
    expect(filter.hiddenNames, isNotNull);
    expect(filter.hiddenNames, ['foo', 'bar'].toSet());
  }

  test_merge_hides_shows() {
    NameFilter filter = new NameFilter.forUnlinkedCombinator(
            new UnlinkedCombinatorBuilder(hides: ['bar', 'baz']))
        .merge(new NameFilter.forUnlinkedCombinator(
            new UnlinkedCombinatorBuilder(shows: ['foo', 'bar'])));
    expect(filter.accepts('foo'), isTrue);
    expect(filter.accepts('bar'), isFalse);
    expect(filter.accepts('baz'), isFalse);
    expect(filter.hiddenNames, isNull);
    expect(filter.shownNames, isNotNull);
    expect(filter.shownNames, ['foo'].toSet());
  }

  test_merge_identity_hides() {
    NameFilter filter = NameFilter.identity.merge(
        new NameFilter.forUnlinkedCombinator(
            new UnlinkedCombinatorBuilder(hides: ['foo', 'bar'])));
    expect(filter.accepts('foo'), isFalse);
    expect(filter.accepts('bar'), isFalse);
    expect(filter.accepts('baz'), isTrue);
    expect(filter.shownNames, isNull);
    expect(filter.hiddenNames, isNotNull);
    expect(filter.hiddenNames, ['foo', 'bar'].toSet());
  }

  test_merge_identity_identity() {
    NameFilter filter = NameFilter.identity.merge(NameFilter.identity);
    expect(filter.accepts('foo'), isTrue);
    expect(filter.hiddenNames, isNotNull);
    expect(filter.hiddenNames, isEmpty);
    expect(filter.shownNames, isNull);
  }

  test_merge_identity_shows() {
    NameFilter filter = NameFilter.identity.merge(
        new NameFilter.forUnlinkedCombinator(
            new UnlinkedCombinatorBuilder(shows: ['foo', 'bar'])));
    expect(filter.accepts('foo'), isTrue);
    expect(filter.accepts('bar'), isTrue);
    expect(filter.accepts('baz'), isFalse);
    expect(filter.hiddenNames, isNull);
    expect(filter.shownNames, isNotNull);
    expect(filter.shownNames, ['foo', 'bar'].toSet());
  }

  test_merge_shows_hides() {
    NameFilter filter = new NameFilter.forUnlinkedCombinator(
            new UnlinkedCombinatorBuilder(shows: ['foo', 'bar']))
        .merge(new NameFilter.forUnlinkedCombinator(
            new UnlinkedCombinatorBuilder(hides: ['bar', 'baz'])));
    expect(filter.accepts('foo'), isTrue);
    expect(filter.accepts('bar'), isFalse);
    expect(filter.accepts('baz'), isFalse);
    expect(filter.hiddenNames, isNull);
    expect(filter.shownNames, isNotNull);
    expect(filter.shownNames, ['foo'].toSet());
  }

  test_merge_shows_identity() {
    NameFilter filter = new NameFilter.forUnlinkedCombinator(
            new UnlinkedCombinatorBuilder(shows: ['foo', 'bar']))
        .merge(NameFilter.identity);
    expect(filter.accepts('foo'), isTrue);
    expect(filter.accepts('bar'), isTrue);
    expect(filter.accepts('baz'), isFalse);
    expect(filter.hiddenNames, isNull);
    expect(filter.shownNames, isNotNull);
    expect(filter.shownNames, ['foo', 'bar'].toSet());
  }

  test_merge_shows_shows() {
    NameFilter filter = new NameFilter.forUnlinkedCombinator(
            new UnlinkedCombinatorBuilder(shows: ['foo', 'bar']))
        .merge(new NameFilter.forUnlinkedCombinator(
            new UnlinkedCombinatorBuilder(shows: ['bar', 'baz'])));
    expect(filter.accepts('foo'), isFalse);
    expect(filter.accepts('bar'), isTrue);
    expect(filter.accepts('baz'), isFalse);
    expect(filter.hiddenNames, isNull);
    expect(filter.shownNames, isNotNull);
    expect(filter.shownNames, ['bar'].toSet());
  }

  test_merge_shows_shows_emptyResult() {
    NameFilter filter = new NameFilter.forUnlinkedCombinator(
            new UnlinkedCombinatorBuilder(shows: ['foo']))
        .merge(new NameFilter.forUnlinkedCombinator(
            new UnlinkedCombinatorBuilder(shows: ['bar'])));
    expect(filter.accepts('foo'), isFalse);
    expect(filter.accepts('bar'), isFalse);
    expect(filter.accepts('baz'), isFalse);
    expect(filter.hiddenNames, isNull);
    expect(filter.shownNames, isNotNull);
    expect(filter.shownNames, isEmpty);
  }
}
