// Copyright (c) 2019, 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:nnbd_migration/src/utilities/scoped_set.dart';
import 'package:test/test.dart';
import 'package:test_reflective_loader/test_reflective_loader.dart';

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

@reflectiveTest
class ScopedSetTest {
  test_clearEachScope() {
    final set = ScopedSet<int>();
    set.pushScope();
    set.add(0);
    set.pushScope(copyCurrent: true);
    set.clearEachScope();
    expect(set.isInScope(0), false);
    set.popScope();
    expect(set.isInScope(0), false);
  }

  test_doScoped_actionPerformed() {
    final set = ScopedSet<int>();
    bool ran = false;
    set.doScoped(action: () {
      ran = true;
    });
    expect(ran, true);
  }

  test_doScoped_actionThrows() {
    final set = ScopedSet<int>();
    bool? threw;
    try {
      set.doScoped(action: () {
        set.add(0);
        throw '';
      });
    } catch (_) {
      threw = true;
    }

    expect(threw, true);
    expect(set.isInScope(0), false);
  }

  test_doScoped_copyCurrent() {
    final set = ScopedSet<int>();
    set.pushScope();
    set.add(0);
    set.doScoped(
        copyCurrent: true,
        action: () {
          set.add(1);
          expect(set.isInScope(0), true);
          expect(set.isInScope(1), true);
        });
    expect(set.isInScope(0), true);
    expect(set.isInScope(1), false);
  }

  test_doScoped_elements() {
    final set = ScopedSet<int>();
    set.pushScope();
    set.doScoped(
        elements: [0, 1],
        action: () {
          expect(set.isInScope(0), true);
          expect(set.isInScope(1), true);
        });
    expect(set.isInScope(0), false);
    expect(set.isInScope(1), false);
  }

  test_doScoped_newScope() {
    final set = ScopedSet<int>();
    set.pushScope();
    set.add(0);
    set.doScoped(action: () {
      set.add(1);
      expect(set.isInScope(0), false);
      expect(set.isInScope(1), true);
    });
    expect(set.isInScope(0), true);
    expect(set.isInScope(1), false);
  }

  test_initiallyEmpty() {
    final set = ScopedSet<int>();
    expect(set.isInScope(0), false);
    expect(set.isInScope(1), false);
  }

  test_popScope_copyCurrent() {
    final set = ScopedSet<int>();
    set.pushScope();
    set.add(0);
    set.pushScope(copyCurrent: true);
    set.popScope();
    expect(set.isInScope(0), true);
  }

  test_popScope_element() {
    final set = ScopedSet<int>();
    set.pushScope();
    set.add(0);
    set.pushScope();
    set.popScope();
    expect(set.isInScope(0), true);
  }

  test_popScope_empty() {
    final set = ScopedSet<int>();
    set.pushScope();
    set.pushScope();
    set.add(0);
    set.popScope();
    expect(set.isInScope(0), false);
  }

  test_pushScope_add() {
    final set = ScopedSet<int>();
    set.pushScope();
    set.add(0);
    expect(set.isInScope(0), true);
  }

  test_pushScope_copyCurrent() {
    final set = ScopedSet<int>();
    set.pushScope();
    set.add(0);
    set.pushScope(copyCurrent: true);
    expect(set.isInScope(0), true);
  }

  test_pushScope_empty() {
    final set = ScopedSet<int>();
    set.pushScope();
    expect(set.isInScope(0), false);
  }

  test_pushScope_empty2() {
    final set = ScopedSet<int>();
    set.pushScope();
    set.add(0);
    set.pushScope();
    expect(set.isInScope(0), false);
  }

  test_pushScope_withElements() {
    final set = ScopedSet<int>();
    set.pushScope(elements: [0, 1]);
    expect(set.isInScope(0), true);
    expect(set.isInScope(1), true);
  }

  test_removeFromAllScopes() {
    final set = ScopedSet<int>();
    set.pushScope(elements: [0, 1]);
    set.pushScope(copyCurrent: true);
    set.removeFromAllScopes(0);
    expect(set.isInScope(0), false);
    expect(set.isInScope(1), true);
    set.popScope();
    expect(set.isInScope(0), false);
    expect(set.isInScope(1), true);
  }
}
