TEST_F(HookRegistrationTest, beforeAllHooksAreInvokedInAnyOrderDuringFirstScenarioOnly) {
    EXPECT_EQ("", afterAllHookCallMarker.str());
    beginScenario(0);
    EXPECT_EQ(correctBeforeAllOrder, sort(beforeAllHookCallMarker.str()));
    
    clearHookCallMarkers();
    invokeStep();
    endScenario();
    EXPECT_EQ("", sort(beforeAllHookCallMarker.str()));
    beginScenario(0);
    invokeStep();
    endScenario();
    EXPECT_EQ("", sort(beforeAllHookCallMarker.str()));
}
TEST_F(HookRegistrationTest, beforeHooksAreInvokedInAnyOrder) {
    EXPECT_EQ("", beforeHookCallMarker.str());
    beginScenario(0);
    EXPECT_EQ(correctBeforeOrder, sort(beforeHookCallMarker.str()));
    invokeStep();
    endScenario();
    EXPECT_EQ(correctBeforeOrder, sort(beforeHookCallMarker.str()));
}
TEST_F(HookRegistrationTest, hooksAreRegisteredByTheMacros) {
    beginScenario(0);
    EXPECT_EQ(correctBeforeOrder, sort(beforeHookOrder()));
    EXPECT_EQ(correctBeforeAroundStepOrder, sort(aroundStepHookOrder()));
    EXPECT_EQ(correctAfterStepOrder, sort(afterStepHookOrder()));
    EXPECT_EQ(correctAfterOrder, sort(afterHookOrder()));
    endScenario();
}
TEST_F(HookRegistrationTest, afterHooksAreInvokedInAnyOrder) {
    beginScenario(0);
    invokeStep();
    invokeStep();
    EXPECT_EQ("", sort(afterHookCallMarker.str()));
    endScenario();
    EXPECT_EQ(correctAfterOrder, sort(afterHookCallMarker.str()));
}
TEST_F(HookRegistrationTest, afterStepHooksAreInvokedAfterAroundStepHooks) {
    beginScenario(0);
    EXPECT_EQ("", globalStepHookCallMarker.str());
    invokeStep();
    EXPECT_EQ(beforeAroundStepHookCallMarker.str() +
              afterAroundStepHookCallMarker.str() +
              afterStepHookCallMarker.str(),
              globalStepHookCallMarker.str());
    endScenario();
}
TEST_F(HookRegistrationTest, aroundStepHooksAreInvokedInAnyOrderButNested) {
    beginScenario(0);
    EXPECT_EQ("", beforeAroundStepHookCallMarker.str());
    invokeStep();
    EXPECT_EQ(correctBeforeAroundStepOrder, sort(beforeAroundStepHookCallMarker.str()));
    EXPECT_EQ(correctAfterAroundStepOrder, sort(afterAroundStepHookCallMarker.str()));
    endScenario();
    EXPECT_EQ(correctBeforeAroundStepOrder, sort(beforeAroundStepHookCallMarker.str()));
    EXPECT_EQ(correctAfterAroundStepOrder, sort(afterAroundStepHookCallMarker.str()));
}
TEST_F(HookRegistrationTest, contextIsAccessibleInAfterHooks) {
    beginScenario(0);
    endScenario();
    EXPECT_EQ(CONTEXT_MARKER, contextContents);
}