// Copyright (c) 2015, 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:async/async.dart';
import 'package:test/test.dart';

import '../utils.dart';

void main() {
  test("runs once before all tests", () {
    return expectTestsPass(() {
      var setUpAllRun = false;
      setUpAll(() {
        expect(setUpAllRun, isFalse);
        setUpAllRun = true;
      });

      test("test 1", () {
        expect(setUpAllRun, isTrue);
      });

      test("test 2", () {
        expect(setUpAllRun, isTrue);
      });
    });
  });

  test("runs once per group, outside-in", () {
    return expectTestsPass(() {
      var setUpAll1Run = false;
      var setUpAll2Run = false;
      var setUpAll3Run = false;
      setUpAll(() {
        expect(setUpAll1Run, isFalse);
        expect(setUpAll2Run, isFalse);
        expect(setUpAll3Run, isFalse);
        setUpAll1Run = true;
      });

      group("mid", () {
        setUpAll(() {
          expect(setUpAll1Run, isTrue);
          expect(setUpAll2Run, isFalse);
          expect(setUpAll3Run, isFalse);
          setUpAll2Run = true;
        });

        group("inner", () {
          setUpAll(() {
            expect(setUpAll1Run, isTrue);
            expect(setUpAll2Run, isTrue);
            expect(setUpAll3Run, isFalse);
            setUpAll3Run = true;
          });

          test("test", () {
            expect(setUpAll1Run, isTrue);
            expect(setUpAll2Run, isTrue);
            expect(setUpAll3Run, isTrue);
          });
        });
      });
    });
  });

  test("runs before setUps", () {
    return expectTestsPass(() {
      var setUpAllRun = false;
      setUp(() {
        expect(setUpAllRun, isTrue);
      });

      setUpAll(() {
        expect(setUpAllRun, isFalse);
        setUpAllRun = true;
      });

      setUp(() {
        expect(setUpAllRun, isTrue);
      });

      test("test", () {
        expect(setUpAllRun, isTrue);
      });
    });
  });

  test("multiples run in order", () {
    return expectTestsPass(() {
      var setUpAll1Run = false;
      var setUpAll2Run = false;
      var setUpAll3Run = false;
      setUpAll(() {
        expect(setUpAll1Run, isFalse);
        expect(setUpAll2Run, isFalse);
        expect(setUpAll3Run, isFalse);
        setUpAll1Run = true;
      });

      setUpAll(() {
        expect(setUpAll1Run, isTrue);
        expect(setUpAll2Run, isFalse);
        expect(setUpAll3Run, isFalse);
        setUpAll2Run = true;
      });

      setUpAll(() {
        expect(setUpAll1Run, isTrue);
        expect(setUpAll2Run, isTrue);
        expect(setUpAll3Run, isFalse);
        setUpAll3Run = true;
      });

      test("test", () {
        expect(setUpAll1Run, isTrue);
        expect(setUpAll2Run, isTrue);
        expect(setUpAll3Run, isTrue);
      });
    });
  });

  group("asynchronously", () {
    test("blocks additional setUpAlls on in-band async", () {
      return expectTestsPass(() {
        var setUpAll1Run = false;
        var setUpAll2Run = false;
        var setUpAll3Run = false;
        setUpAll(() async {
          expect(setUpAll1Run, isFalse);
          expect(setUpAll2Run, isFalse);
          expect(setUpAll3Run, isFalse);
          await pumpEventQueue();
          setUpAll1Run = true;
        });

        setUpAll(() async {
          expect(setUpAll1Run, isTrue);
          expect(setUpAll2Run, isFalse);
          expect(setUpAll3Run, isFalse);
          await pumpEventQueue();
          setUpAll2Run = true;
        });

        setUpAll(() async {
          expect(setUpAll1Run, isTrue);
          expect(setUpAll2Run, isTrue);
          expect(setUpAll3Run, isFalse);
          await pumpEventQueue();
          setUpAll3Run = true;
        });

        test("test", () {
          expect(setUpAll1Run, isTrue);
          expect(setUpAll2Run, isTrue);
          expect(setUpAll3Run, isTrue);
        });
      });
    });

    test("doesn't block additional setUpAlls on out-of-band async", () {
      return expectTestsPass(() {
        var setUpAll1Run = false;
        var setUpAll2Run = false;
        var setUpAll3Run = false;
        setUpAll(() {
          expect(setUpAll1Run, isFalse);
          expect(setUpAll2Run, isFalse);
          expect(setUpAll3Run, isFalse);

          expect(
              pumpEventQueue().then((_) {
                setUpAll1Run = true;
              }),
              completes);
        });

        setUpAll(() {
          expect(setUpAll1Run, isFalse);
          expect(setUpAll2Run, isFalse);
          expect(setUpAll3Run, isFalse);

          expect(
              pumpEventQueue().then((_) {
                setUpAll2Run = true;
              }),
              completes);
        });

        setUpAll(() {
          expect(setUpAll1Run, isFalse);
          expect(setUpAll2Run, isFalse);
          expect(setUpAll3Run, isFalse);

          expect(
              pumpEventQueue().then((_) {
                setUpAll3Run = true;
              }),
              completes);
        });

        test("test", () {
          expect(setUpAll1Run, isTrue);
          expect(setUpAll2Run, isTrue);
          expect(setUpAll3Run, isTrue);
        });
      });
    });
  });

  test("isn't run for a skipped group", () async {
    // Declare this in the outer test so if it runs, the outer test will fail.
    var shouldNotRun = expectAsync0(() {}, count: 0);

    var engine = declareEngine(() {
      group("skipped", () {
        setUpAll(shouldNotRun);

        test("test", () {});
      }, skip: true);
    });

    await engine.run();
    expect(engine.liveTests, hasLength(1));
    expect(engine.skipped, hasLength(1));
    expect(engine.liveTests, equals(engine.skipped));
  });

  test("is emitted through Engine.onTestStarted", () async {
    var engine = declareEngine(() {
      setUpAll(() {});

      test("test", () {});
    });

    var queue = new StreamQueue(engine.onTestStarted);
    var setUpAllFuture = queue.next;
    var liveTestFuture = queue.next;

    await engine.run();

    var setUpAllLiveTest = await setUpAllFuture;
    expect(setUpAllLiveTest.test.name, equals("(setUpAll)"));
    expectTestPassed(setUpAllLiveTest);

    // The fake test for setUpAll should be removed from the engine's live
    // test list so that reporters don't display it as a passed test.
    expect(engine.liveTests, isNot(contains(setUpAllLiveTest)));
    expect(engine.passed, isNot(contains(setUpAllLiveTest)));
    expect(engine.failed, isNot(contains(setUpAllLiveTest)));
    expect(engine.skipped, isNot(contains(setUpAllLiveTest)));
    expect(engine.active, isNot(contains(setUpAllLiveTest)));

    var liveTest = await liveTestFuture;
    expectTestPassed(await liveTestFuture);
    expect(engine.liveTests, contains(liveTest));
    expect(engine.passed, contains(liveTest));
  });

  group("with an error", () {
    test("reports the error and remains in Engine.liveTests", () async {
      var engine = declareEngine(() {
        setUpAll(() => throw new TestFailure("fail"));

        test("test", () {});
      });

      var queue = new StreamQueue(engine.onTestStarted);
      var setUpAllFuture = queue.next;

      expect(await engine.run(), isFalse);

      var setUpAllLiveTest = await setUpAllFuture;
      expect(setUpAllLiveTest.test.name, equals("(setUpAll)"));
      expectTestFailed(setUpAllLiveTest, "fail");

      // The fake test for setUpAll should be removed from the engine's live
      // test list so that reporters don't display it as a passed test.
      expect(engine.liveTests, contains(setUpAllLiveTest));
      expect(engine.failed, contains(setUpAllLiveTest));
      expect(engine.passed, isNot(contains(setUpAllLiveTest)));
      expect(engine.skipped, isNot(contains(setUpAllLiveTest)));
      expect(engine.active, isNot(contains(setUpAllLiveTest)));
    });

    test("doesn't run tests in the group", () async {
      // Declare this in the outer test so if it runs, the outer test will fail.
      var shouldNotRun = expectAsync0(() {}, count: 0);

      var engine = declareEngine(() {
        setUpAll(() => throw "error");

        test("test", shouldNotRun);
      });

      expect(await engine.run(), isFalse);
    });

    test("doesn't run inner groups", () async {
      // Declare this in the outer test so if it runs, the outer test will fail.
      var shouldNotRun = expectAsync0(() {}, count: 0);

      var engine = declareEngine(() {
        setUpAll(() => throw "error");

        group("group", () {
          test("test", shouldNotRun);
        });
      });

      expect(await engine.run(), isFalse);
    });

    test("doesn't run further setUpAlls", () async {
      // Declare this in the outer test so if it runs, the outer test will fail.
      var shouldNotRun = expectAsync0(() {}, count: 0);

      var engine = declareEngine(() {
        setUpAll(() => throw "error");
        setUpAll(shouldNotRun);

        test("test", shouldNotRun);
      });

      expect(await engine.run(), isFalse);
    });
  });
}
