// Copyright 2015 ThoughtWorks, Inc.
// This file is part of Gauge-Java.
// This program is free software.
//
// It is dual-licensed under:
// 1) the GNU General Public License as published by the Free Software Foundation,
// either version 3 of the License, or (at your option) any later version;
// or
// 2) the Eclipse Public License v1.0.
//
// You can redistribute it and/or modify it under the terms of either license.
// We would then provide copied of each license in a separate .txt file with the name of the license as the title of the file.
package com.thoughtworks.gauge.registry;
import com.thoughtworks.gauge.*;
import com.thoughtworks.gauge.hook.Hook;
import junit.framework.TestCase;
import java.lang.reflect.Method;
import java.util.Arrays;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
public class HooksRegistryTest extends TestCase {
public void testAddingHooksBeforeAndAfterSuite() throws Exception {
Method beforeSuite = TestHooksImplClass.class.getMethod("beforeSuite");
Method afterSuite = TestHooksImplClass.class.getMethod("afterSuite");
HooksRegistry.addBeforeSuiteHooks(createSet(beforeSuite));
HooksRegistry.addAfterSuiteHooks(createSet(afterSuite));
List<Hook> beforeSuiteHooks = HooksRegistry.getBeforeSuiteHooks();
assertEquals(1, beforeSuiteHooks.size());
assertEquals(beforeSuite, beforeSuiteHooks.get(0).getMethod());
assertEquals(0, beforeSuiteHooks.get(0).getTags().size());
List<Hook> afterSuiteHooks = HooksRegistry.getAfterSuiteHooks();
assertEquals(1, beforeSuiteHooks.size());
assertEquals(afterSuite, afterSuiteHooks.get(0).getMethod());
assertEquals(0, afterSuiteHooks.get(0).getTags().size());
}
public void testAddingHooksBeforeAndAfterSpecAndScenario() throws Exception {
Method beforeSpec = TestHooksImplClass.class.getMethod("beforeSpec");
Method afterSpec = TestHooksImplClass.class.getMethod("afterSpec", ExecutionContext.class);
Method beforeScenario = TestHooksImplClass.class.getMethod("beforeScenario");
Method afterScenario = TestHooksImplClass.class.getMethod("taggedAfterScenario");
HooksRegistry.addBeforeScenarioHooks(createSet(beforeScenario));
HooksRegistry.addAfterScenarioHooks(createSet(afterScenario));
HooksRegistry.addBeforeSpecHooks(createSet(beforeSpec));
HooksRegistry.addAfterSpecHooks(createSet(afterSpec));
List<Hook> beforeSpecHooks = HooksRegistry.getBeforeSpecHooks();
assertEquals(1, beforeSpecHooks.size());
assertEquals(beforeSpec, beforeSpecHooks.get(0).getMethod());
assertEquals(1, beforeSpecHooks.get(0).getTags().size());
assertTrue(beforeSpecHooks.get(0).getTags().contains("specTag"));
List<Hook> afterSpecHooks = HooksRegistry.getAfterSpecHooks();
assertEquals(1, afterSpecHooks.size());
assertEquals(afterSpec, afterSpecHooks.get(0).getMethod());
assertEquals(0, afterSpecHooks.get(0).getTags().size());
List<Hook> beforeScenarioHooks = HooksRegistry.getBeforeScenarioHooks();
assertEquals(1, beforeScenarioHooks.size());
assertEquals(beforeScenario, beforeScenarioHooks.get(0).getMethod());
assertEquals(0, beforeScenarioHooks.get(0).getTags().size());
assertEquals(Operator.AND, beforeScenarioHooks.get(0).getTagsAggregation());
List<Hook> afterScenarioHooks = HooksRegistry.getAfterScenarioHooks();
assertEquals(1, afterScenarioHooks.size());
assertEquals(afterScenario, afterScenarioHooks.get(0).getMethod());
List<String> afterScenarioTags = afterScenarioHooks.get(0).getTags();
assertEquals(3, afterScenarioTags.size());
assertTrue(afterScenarioTags.contains("scenarioTag1"));
assertTrue(afterScenarioTags.contains("scenarioTag2"));
assertTrue(afterScenarioTags.contains("scenarioTag3"));
assertEquals(Operator.OR, ((Hook) afterScenarioHooks.toArray()[0]).getTagsAggregation());
}
public void testAddingBeforeAndAfterStepHooks() throws Exception {
Method beforeStep1 = TestHooksImplClass.class.getMethod("beforeStep1");
Method beforeStep2 = TestHooksImplClass.class.getMethod("beforeStep2");
Method afterStep = TestHooksImplClass.class.getMethod("afterStep");
HooksRegistry.addBeforeStepHooks(createSet(beforeStep1, beforeStep2));
HooksRegistry.setAfterStepHooks(createSet(afterStep));
List<Hook> beforeStepHooks = HooksRegistry.getBeforeStepHooks();
assertEquals(2, beforeStepHooks.size());
List<Hook> afterStepHooks = HooksRegistry.getAfterStepHooks();
assertEquals(1, afterStepHooks.size());
assertEquals(afterStep, afterStepHooks.get(0).getMethod());
assertEquals(1, afterStepHooks.get(0).getTags().size());
assertTrue(((Hook) afterStepHooks.toArray()[0]).getTags().contains("afterStep"));
assertEquals(Operator.OR, ((Hook) afterStepHooks.toArray()[0]).getTagsAggregation());
}
public void testAddingBeforeAndAfterClassStepHooks() throws Exception {
Method beforeClassSteps1 = TestHooksImplClass.class.getMethod("beforeClassSteps1");
Method beforeClassSteps2 = TestHooksImplClass.class.getMethod("beforeClassSteps2");
Method afterClassSteps = TestHooksImplClass.class.getMethod("afterClassSteps");
HooksRegistry.addBeforeClassStepsHooks(createSet(beforeClassSteps1, beforeClassSteps2));
HooksRegistry.addAfterClassStepsHooks(createSet(afterClassSteps));
List<Hook> beforeHooks = HooksRegistry.getBeforeClassStepsHooksOfClass(TestHooksImplClass.class);
assertEquals(2, beforeHooks.size());
Set<Method> beforeMethods = hooksMethodList(beforeHooks);
assertTrue(beforeMethods.contains(beforeClassSteps1));
assertTrue(beforeMethods.contains(beforeClassSteps2));
List<Hook> afterHooks = HooksRegistry.getAfterClassStepsHooksOfClass(TestHooksImplClass.class);
Set<Method> afterHookMethods = hooksMethodList(afterHooks);
assertEquals(1, afterHooks.size());
assertTrue(afterHookMethods.contains(afterClassSteps));
}
public void testSortingOfPreHooks() throws NoSuchMethodException {
Method beforeScenario = TestHooksImplClass.class.getMethod("beforeScenario");
Method aBeforeScenario = TestHooksImplClass.class.getMethod("aBeforeScenario");
Method taggedBeforeScenario = TestHooksImplClass.class.getMethod("taggedBeforeScenario");
HooksRegistry.addBeforeScenarioHooks(createSet(beforeScenario, aBeforeScenario));
HooksRegistry.addBeforeScenarioHooks(createSet(taggedBeforeScenario));
List<Hook> sortedPreHooks = HooksRegistry.getBeforeScenarioHooks();
assertEquals("aBeforeScenario", sortedPreHooks.get(0).getMethod().getName());
assertEquals("beforeScenario", sortedPreHooks.get(1).getMethod().getName());
assertEquals("taggedBeforeScenario", sortedPreHooks.get(2).getMethod().getName());
}
public void testSortingOfPostHooks() throws NoSuchMethodException {
Method afterScenario = TestHooksImplClass.class.getMethod("afterScenario");
Method taggedAfterScenario = TestHooksImplClass.class.getMethod("taggedAfterScenario");
Method secondAfterScenario = TestHooksImplClass.class.getMethod("secondAfterScenario");
HooksRegistry.addAfterScenarioHooks(createSet(afterScenario, secondAfterScenario));
HooksRegistry.addAfterScenarioHooks(createSet(taggedAfterScenario));
List<Hook> sortedPostHooks = HooksRegistry.getAfterScenarioHooks();
assertEquals("taggedAfterScenario", sortedPostHooks.get(0).getMethod().getName());
assertEquals("secondAfterScenario", sortedPostHooks.get(1).getMethod().getName());
assertEquals("afterScenario", sortedPostHooks.get(2).getMethod().getName());
}
private Set<Method> hooksMethodList(List<Hook> hooks) {
HashSet<Method> methods = new HashSet<Method>();
for (Hook hook : hooks) {
methods.add(hook.getMethod());
}
return methods;
}
protected void tearDown() throws Exception {
HooksRegistry.remove(BeforeStep.class);
HooksRegistry.remove(AfterStep.class);
HooksRegistry.remove(BeforeScenario.class);
HooksRegistry.remove(AfterScenario.class);
HooksRegistry.remove(BeforeSuite.class);
HooksRegistry.remove(AfterSuite.class);
HooksRegistry.remove(BeforeSpec.class);
HooksRegistry.remove(AfterSpec.class);
HooksRegistry.remove(AfterClassSteps.class);
HooksRegistry.remove(BeforeClassSteps.class);
}
private HashSet<Method> createSet(Method... methods) {
HashSet<Method> methodSet = new HashSet<Method>();
methodSet.addAll(Arrays.asList(methods));
return methodSet;
}
public class TestHooksImplClass {
@BeforeStep
public void beforeStep1() {
}
@BeforeStep
public void beforeStep2() {
}
@AfterStep(tags = "afterStep", tagAggregation = Operator.OR)
public void afterStep() {
}
@BeforeScenario
public void beforeScenario() {
}
@BeforeScenario
public void aBeforeScenario() {
}
@BeforeScenario(tags = {"tag1"})
public void taggedBeforeScenario() {
}
@AfterScenario(tags = {"scenarioTag1", "scenarioTag2", "scenarioTag3"}, tagAggregation = Operator.OR)
public void taggedAfterScenario() {
}
@AfterScenario
public void afterScenario() {
}
@AfterScenario
public void secondAfterScenario() {
}
@BeforeSpec(tags = {"specTag"})
public void beforeSpec() {
}
@AfterSpec()
public void afterSpec(ExecutionContext context) {
}
@BeforeSuite
public void beforeSuite() {
}
@AfterSuite
public void afterSuite() {
}
@BeforeClassSteps(tags = {"tag1", "tag2"})
public void beforeClassSteps1() {
}
@BeforeClassSteps
public void beforeClassSteps2() {
}
@AfterClassSteps(tags = {"tag3", "tag4"}, tagAggregation = Operator.OR)
public void afterClassSteps() {
}
}
}