Skip to content

Commit

Permalink
Implemented ExtensionContext.setAttribute|getAttribute|removeAttribute.
Browse files Browse the repository at this point in the history
------------------------------------------------------------------------
On behalf of the community, the JUnit Lambda Team thanks
Samuraism, Inc. (http://samuraism.com/) for supporting the
JUnit crowdfunding campaign!
------------------------------------------------------------------------
  • Loading branch information
jlink committed Dec 29, 2015
1 parent 969c523 commit cf91ce4
Show file tree
Hide file tree
Showing 6 changed files with 105 additions and 34 deletions.
Expand Up @@ -10,50 +10,113 @@

package org.junit.gen5.engine.junit5.descriptor;

import static org.junit.gen5.api.Assertions.*;

import java.util.Optional;

import org.junit.Test;
import org.junit.gen5.api.Assertions;
import org.junit.gen5.api.extension.ExtensionContext;
import org.junit.gen5.engine.TestDescriptor;

/**
* Microtests for implementors of {@linkplain ExtensionContext}: {@linkplain ClassBasedContainerExtensionContext} and
* {@linkplain MethodBasedTestExtensionContext}
*/
public class ExtensionContextTest {

@Test
public void fromClassTestDescriptor() {
ClassTestDescriptor outerClassDescriptor = new ClassTestDescriptor("OuterClass", OuterClass.class);
ClassTestDescriptor nestedClassDescriptor = new ClassTestDescriptor("NestedClass",
OuterClass.NestedClass.class);
outerClassDescriptor.addChild(nestedClassDescriptor);
ClassTestDescriptor nestedClassDescriptor = nestedClassDescriptor();
ClassTestDescriptor outerClassDescriptor = outerClassDescriptor(nestedClassDescriptor);

ClassBasedContainerExtensionContext outerExtensionContext = new ClassBasedContainerExtensionContext(null,
outerClassDescriptor);
Assertions.assertAll("outerContext", //
() -> Assertions.assertEquals(OuterClass.class, outerExtensionContext.getTestClass()), //
() -> Assertions.assertEquals(outerClassDescriptor.getDisplayName(),
outerExtensionContext.getDisplayName()), //
() -> Assertions.assertEquals(Optional.empty(), outerExtensionContext.getParent()));
() -> assertEquals(OuterClass.class, outerExtensionContext.getTestClass()), //
() -> assertEquals(outerClassDescriptor.getDisplayName(), outerExtensionContext.getDisplayName()), //
() -> assertEquals(Optional.empty(), outerExtensionContext.getParent()) //
);

ClassBasedContainerExtensionContext nestedExtensionContext = new ClassBasedContainerExtensionContext(
outerExtensionContext, nestedClassDescriptor);
Assertions.assertSame(outerExtensionContext, nestedExtensionContext.getParent().get());
}

@Test
public void fromMethodTestDescriptor() throws NoSuchMethodException {
ClassTestDescriptor classTestDescriptor = new ClassTestDescriptor("OuterClass", OuterClass.class);
MethodTestDescriptor methodTestDescriptor = new MethodTestDescriptor("aMethod", OuterClass.class,
OuterClass.class.getDeclaredMethod("aMethod"));
classTestDescriptor.addChild(methodTestDescriptor);
public void fromMethodTestDescriptor() {
MethodTestDescriptor methodTestDescriptor = methodDescriptor();
ClassTestDescriptor classTestDescriptor = outerClassDescriptor(methodTestDescriptor);

ClassBasedContainerExtensionContext classExtensionContext = new ClassBasedContainerExtensionContext(null,
classTestDescriptor);
OuterClass testInstance = new OuterClass();
MethodBasedTestExtensionContext testExtensionContext = new MethodBasedTestExtensionContext(
classExtensionContext, methodTestDescriptor, testInstance);
classExtensionContext, methodTestDescriptor, new OuterClass());
Assertions.assertAll("methodContext", //
() -> Assertions.assertEquals(OuterClass.class, testExtensionContext.getTestClass()), //
() -> Assertions.assertEquals(methodTestDescriptor.getDisplayName(), testExtensionContext.getDisplayName()), //
() -> Assertions.assertEquals(classExtensionContext, testExtensionContext.getParent().get()));
() -> assertEquals(OuterClass.class, testExtensionContext.getTestClass()), //
() -> assertEquals(methodTestDescriptor.getDisplayName(), testExtensionContext.getDisplayName()), //
() -> assertEquals(classExtensionContext, testExtensionContext.getParent().get()), //
() -> assertEquals(OuterClass.class, testExtensionContext.getTestInstance().getClass()) //
);

}

@Test
public void flatAttributeAccess() {
ClassTestDescriptor classTestDescriptor = outerClassDescriptor(null);

ExtensionContext parentContext = new ClassBasedContainerExtensionContext(null, classTestDescriptor);

assertNull(parentContext.getAttribute("not set"));

parentContext.putAttribute("attr1", "value1");
assertEquals("value1", parentContext.getAttribute("attr1"));

assertEquals("value1", parentContext.removeAttribute("attr1"));
assertNull(parentContext.getAttribute("attr1"));

}

@Test
public void nestedAttributeAccess() {
MethodTestDescriptor methodTestDescriptor = methodDescriptor();
ClassTestDescriptor classTestDescriptor = outerClassDescriptor(methodTestDescriptor);

ExtensionContext parentContext = new ClassBasedContainerExtensionContext(null, classTestDescriptor);

MethodBasedTestExtensionContext childContext = new MethodBasedTestExtensionContext(parentContext,
methodTestDescriptor, new OuterClass());

parentContext.putAttribute("attr1", "value1");
assertEquals("value1", childContext.getAttribute("attr1"));

childContext.putAttribute("attr1", "value1 changed");
assertEquals("value1 changed", childContext.getAttribute("attr1"));
assertEquals("value1", parentContext.getAttribute("attr1"));

childContext.removeAttribute("attr1");
assertEquals("value1", childContext.getAttribute("attr1"));

}

private ClassTestDescriptor nestedClassDescriptor() {
return new ClassTestDescriptor("NestedClass", OuterClass.NestedClass.class);
}

private ClassTestDescriptor outerClassDescriptor(TestDescriptor child) {
ClassTestDescriptor classTestDescriptor = new ClassTestDescriptor("OuterClass", OuterClass.class);
if (child != null)
classTestDescriptor.addChild(child);
return classTestDescriptor;
}

private MethodTestDescriptor methodDescriptor() {
try {
return new MethodTestDescriptor("aMethod", OuterClass.class, OuterClass.class.getDeclaredMethod("aMethod"));
}
catch (NoSuchMethodException e) {
throw new RuntimeException(e);
}
}

static class OuterClass {
Expand Down
Expand Up @@ -20,5 +20,4 @@
*/
public interface ContainerExtensionContext extends ExtensionContext {

Optional<Object> getContainerInstance();
}
Expand Up @@ -31,8 +31,11 @@ public interface ExtensionContext {

Class<?> getTestClass();

Map<String, Object> getAttributes();

AnnotatedElement getElement();

Object getAttribute(String key);

void putAttribute(String key, Object value);

Object removeAttribute(String key);
}
Expand Up @@ -10,15 +10,15 @@

package org.junit.gen5.engine.junit5.descriptor;

import java.util.LinkedHashMap;
import java.util.HashMap;
import java.util.Map;
import java.util.Optional;

import org.junit.gen5.api.extension.ExtensionContext;

abstract class AbstractExtensionContext implements ExtensionContext {

private final Map<String, Object> attributes = new LinkedHashMap<>();
private final Map<String, Object> attributes = new HashMap<>();

private ExtensionContext parent;

Expand All @@ -32,9 +32,20 @@ public Optional<ExtensionContext> getParent() {
}

@Override
// TODO Replace with methods to set and get attributes. Maybe with lifecycle?
public Map<String, Object> getAttributes() {
return attributes;
public Object getAttribute(String key) {
Object value = attributes.get(key);
if (value == null && parent != null)
return parent.getAttribute(key);
return value;
}

@Override
public void putAttribute(String key, Object value) {
attributes.put(key, value);
}

@Override
public Object removeAttribute(String key) {
return attributes.remove(key);
}
}
Expand Up @@ -40,9 +40,4 @@ public AnnotatedElement getElement() {
return getTestClass();
}

@Override
public Optional<Object> getContainerInstance() {
// TODO implement this
return Optional.empty();
}
}
Expand Up @@ -37,17 +37,17 @@ public void registerExtensions(ExtensionRegistry registry) {

private void beforeEach(TestExtensionContext context) throws Exception {
Method testMethod = context.getTestMethod();
context.getAttributes().put(createKey(testMethod), System.currentTimeMillis());
context.putAttribute(createKey(testMethod), System.currentTimeMillis());
}

private void afterEach(TestExtensionContext context) throws Exception {
Method testMethod = context.getTestMethod();
String key = createKey(testMethod);
long start = (long) context.getAttributes().get(key);
long start = (long) context.getAttribute(key);
long end = System.currentTimeMillis();

System.out.println(String.format("Method [%s] took %s ms", testMethod.getName(), (end - start)));
context.getAttributes().remove(key);
context.removeAttribute(key);
}

private String createKey(Method testMethod) {
Expand Down

0 comments on commit cf91ce4

Please sign in to comment.