public override void Specify()
        {
            List <string> recording = new List <string>();
            int           tracer    = 0;

            given("a fixture with global setup", delegate
            {
                var fixture = new LambdaFixture()
                {
                    LambdaSpecify = f =>
                    {
                        var firstSetup = f.beforeAll(delegate
                        {
                            recording.Add("beforeAll " + tracer++);
                            return("beforeAll result " + tracer++);
                        });

                        f.afterAll(delegate
                        {
                            recording.Add("first setup was: " + firstSetup);
                        });

                        f.it("tests something", delegate
                        {
                        });

                        f.describe("some nested tests", delegate
                        {
                            f.beforeAll(() => recording.Add("nested beforeAll " + tracer++));
                            f.afterAll(delegate
                            {
                                recording.Add("nested afterAll " + tracer++);
                            });

                            f.it("a nested test", delegate
                            {
                                int i = 0;
                            });
                        });

                        f.describe("more nested tests", delegate
                        {
                            f.it("has a test", delegate
                            {
                            });
                        });
                    }
                };

                var sut = arrange(() => new GlobalSetupManager(() => fixture));
                cleanup(() => sut.Close());

                when("a test is going to be run", delegate
                {
                    beforeEach(() => sut.PrepareForTestPosition(TestPosition.At(2)));

                    then("the global setup has ran", delegate
                    {
                        Assert.That(recording, Is.EquivalentTo(new[] { "beforeAll 0" }));
                    });

                    then("the global setup result is available", delegate
                    {
                        expect(() => "beforeAll result 1" == sut.GetSetupResultAt <string>(TestPosition.At(0)));
                    });

                    when("a later nested test is going to be ran", delegate
                    {
                        beforeEach(() => sut.PrepareForTestPosition(TestPosition.At(3, 2)));

                        then("the global setup has ran", delegate
                        {
                            Assert.That(recording, Is.EquivalentTo(new[]
                            {
                                "beforeAll 0",
                                "nested beforeAll 2",
                            }));
                        });

                        when("a later test nested in another block is going to be ran", delegate
                        {
                            beforeEach(() => sut.PrepareForTestPosition(TestPosition.At(4, 0)));

                            then("the global setup has ran", delegate
                            {
                                Assert.That(recording, Is.EquivalentTo(new[]
                                {
                                    "beforeAll 0",
                                    "nested beforeAll 2",
                                    "nested afterAll 3"
                                }));
                            });
                        });

                        when("we're done running tests", delegate
                        {
                            beforeEach(() => sut.Cleanup(TestPosition.At()));

                            then("expected cleanup runs", delegate
                            {
                                Assert.That(recording, Is.EquivalentTo(new[]
                                {
                                    "beforeAll 0",
                                    "nested beforeAll 2",
                                    "nested afterAll 3",
                                    "first setup was: beforeAll result 1"
                                }));
                            });

                            then("the setup thread finishes", delegate
                            {
                                expect(() => !sut.HasThread());
                            });
                        });
                    });
                });
            });

            given("a fixture with an error at its outer scope", delegate
            {
                var fixture = new LambdaFixture()
                {
                    LambdaSpecify = f =>
                    {
                        int i = 0;
                        int j = 100 / i;

                        it("has a test", delegate
                        {
                        });
                    }
                };

                var sut = arrange(() => new GlobalSetupManager(() => fixture));
                cleanup(() => sut.Close());

                when("a test is to be ran", delegate
                {
                    Exception exception = beforeEach(() => sut.PrepareForTestPosition(TestPosition.At(0)));

                    then("the exception is reported", delegate
                    {
                        expect(() => exception != null);
                    });

                    when("we're done running tests", delegate
                    {
                        expect(() => sut.HasThread());
                        beforeEach(() => sut.Cleanup(TestPosition.At()));

                        then("the setup thread finishes", delegate
                        {
                            expect(() => !sut.HasThread());
                        });
                    });
                });
            });
        }
        public override void Specify()
        {
            List<string> recording = new List<string>();
            int tracer = 0;

            given("a fixture with global setup", delegate
            {
                var fixture = new LambdaFixture()
                {
                    LambdaSpecify = f =>
                    {
                        var firstSetup = f.beforeAll(delegate
                        {
                            recording.Add("beforeAll " + tracer++);
                            return "beforeAll result " + tracer++;
                        });

                        f.afterAll(delegate
                        {
                            recording.Add("first setup was: " + firstSetup);
                        });

                        f.it("tests something", delegate
                        {
                        });

                        f.describe("some nested tests", delegate
                        {
                            f.beforeAll(() => recording.Add("nested beforeAll " + tracer++));
                            f.afterAll(delegate
                            {
                                recording.Add("nested afterAll " + tracer++);
                            });

                            f.it("a nested test", delegate
                            {
                                int i = 0;
                            });
                        });

                        f.describe("more nested tests", delegate
                        {
                            f.it("has a test", delegate
                            {

                            });
                        });
                    }
                };

                var sut = arrange(() => new GlobalSetupManager());

                arrange(() => sut.Initialize(() => fixture));

                cleanup(() => sut.Close());

                when("a test is going to be run", delegate
                {
                    Exception ignored;

                    act(() => sut.PrepareForTestPosition(new TestPosition(2), out ignored));

                    then("the global setup has ran", delegate
                    {
                        Assert.That(recording, Is.EquivalentTo(new[] {"beforeAll 0"}));
                    });

                    then("the global setup result is available", delegate
                    {
                        expect(() => "beforeAll result 1" == sut.GetSetupResultAt<string>(new TestPosition(0)));
                    });

                    when("a later nested test is going to be ran", delegate
                    {

                        act(() => sut.PrepareForTestPosition(new TestPosition(3, 2), out ignored));

                        then("the global setup has ran", delegate
                        {
                            Assert.That(recording, Is.EquivalentTo(new[]
                            {
                                "beforeAll 0",
                                "nested beforeAll 2",
                            }));
                        });

                        when("a later test nested in another block is going to be ran", delegate
                        {
                            act(() => sut.PrepareForTestPosition(new TestPosition(4, 0), out ignored));

                            then("the global setup has ran", delegate
                            {
                                Assert.That(recording, Is.EquivalentTo(new[]
                                {
                                    "beforeAll 0",
                                    "nested beforeAll 2",
                                    "nested afterAll 3"
                                }));
                            });
                        });

                        when("we're done running tests", delegate
                        {
                            act(() => sut.Cleanup(new TestPosition()));

                            then("expected cleanup runs", delegate
                            {
                                Assert.That(recording, Is.EquivalentTo(new[]
                                {
                                    "beforeAll 0",
                                    "nested beforeAll 2",
                                    "nested afterAll 3",
                                    "first setup was: beforeAll result 1"
                                }));
                            });

                            then("the setup thread finishes", delegate
                            {
                                expect(() => !sut.HasThread());
                            });
                        });
                    });
                });
            });

            given("a fixture with an error at its outer scope", delegate
            {
                var fixture = new LambdaFixture()
                {
                    LambdaSpecify = f =>
                    {
                        int i = 0;
                        int j = 100 / i;

                        it("has a test", delegate
                        {

                        });
                    }
                };

                var sut = arrange(() => new GlobalSetupManager());

                arrange(() => sut.Initialize(() => fixture));

                cleanup(() => sut.Close());

                when("a test is to be ran", delegate
                {
                    Exception exception = null;

                    act(() => sut.PrepareForTestPosition(new TestPosition(0), out exception));

                    then("the exception is reported", delegate
                    {
                        expect(() => exception != null);
                    });

                    when("we're done running tests", delegate
                    {
                        expect(() => sut.HasThread());
                        act(() => sut.Cleanup(new TestPosition()));

                        then("the setup thread finishes", delegate
                        {
                            expect(() => !sut.HasThread());
                        });
                    });
                });
            });
        }