Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Integrated ExtensionContext.getStore #128

Merged
merged 3 commits into from
Jan 19, 2016
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -122,45 +122,25 @@ public void reportEntriesArePublishedToExecutionContext() {
}

@Test
public void storingAttributesWithDefaultNamespace() {
public void usingStore() {
MethodTestDescriptor methodTestDescriptor = methodDescriptor();
ClassTestDescriptor classTestDescriptor = outerClassDescriptor(methodTestDescriptor);
ExtensionContext parentContext = new ClassBasedContainerExtensionContext(null, null, classTestDescriptor);
MethodBasedTestExtensionContext childContext = new MethodBasedTestExtensionContext(parentContext, null,
methodTestDescriptor, new OuterClass());

childContext.put("a key", "a value");
assertEquals("a value", childContext.get("a key"));
ExtensionContext.Store store = childContext.getStore();

assertEquals("other value", childContext.getOrComputeIfAbsent("other key", key -> "other value"));
store.put("a key", "a value");
assertEquals("a value", store.get("a key"));

childContext.remove("a key");
assertNull(childContext.get("a key"));
assertEquals("other value", store.getOrComputeIfAbsent("other key", key -> "other value"));

parentContext.put("parent key", "parent value");
assertEquals("parent value", childContext.get("parent key"));
}

@Test
public void storingAttributesWithNamespace() {
MethodTestDescriptor methodTestDescriptor = methodDescriptor();
ClassTestDescriptor classTestDescriptor = outerClassDescriptor(methodTestDescriptor);
ExtensionContext parentContext = new ClassBasedContainerExtensionContext(null, null, classTestDescriptor);
MethodBasedTestExtensionContext childContext = new MethodBasedTestExtensionContext(parentContext, null,
methodTestDescriptor, new OuterClass());

String namespace = "a namespace";

childContext.put("a key", "a value", namespace);
assertEquals("a value", childContext.get("a key", namespace));

assertEquals("other value", childContext.getOrComputeIfAbsent("other key", key -> "other value"), namespace);

childContext.remove("a key", namespace);
assertNull(childContext.get("a key", namespace));
assertEquals("a value", store.remove("a key"));
assertNull(store.get("a key"));

parentContext.put("parent key", "parent value", namespace);
assertEquals("parent value", childContext.get("parent key", namespace));
store.put("parent key", "parent value");
assertEquals("parent value", store.get("parent key"));
}

private ClassTestDescriptor nestedClassDescriptor() {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,7 @@
import org.junit.gen5.api.BeforeEach;
import org.junit.gen5.api.Nested;
import org.junit.gen5.api.Test;
import org.junit.gen5.engine.junit5.descriptor.ExtensionValuesStore.Namespace;
import org.junit.gen5.api.extension.ExtensionContext.*;

/**
* Microtests for {@link ExtensionValuesStore}
Expand All @@ -29,66 +29,111 @@ class ExtensionValuesStoreTests {

private Object value = createObject("value");

private Namespace namespace = Namespace.of("ns");

@BeforeEach
void initializeStore() {
parentStore = new ExtensionValuesStore();
store = new ExtensionValuesStore(parentStore);
}

@Nested
class UsingDefaultNamespaceTests {
class StoringValuesTests {

@Test
void getWithUnknownKeyReturnsNull() {
assertNull(store.get("unknown key"));
assertNull(store.get(namespace, "unknown key"));
}

@Test
void putAndGetWithSameKey() {

store.put(key, value);
assertEquals(value, store.get(key));
store.put(namespace, key, value);
assertEquals(value, store.get(namespace, key));
}

@Test
void valueCanBeReplaced() {
store.put(key, value);
store.put(namespace, key, value);

Object newValue = new Object();
store.put(key, newValue);
store.put(namespace, key, newValue);

assertEquals(newValue, store.get(key));
assertEquals(newValue, store.get(namespace, key));
}

@Test
void valueIsComputedIfAbsent() {
assertEquals(value, store.getOrComputeIfAbsent(key, innerKey -> value));
assertEquals(value, store.get(key));
assertEquals(value, store.getOrComputeIfAbsent(namespace, key, innerKey -> value));
assertEquals(value, store.get(namespace, key));
}

@Test
void valueIsNotComputedIfPresent() {
store.put(key, value);
store.put(namespace, key, value);

assertEquals(value, store.getOrComputeIfAbsent(key, innerKey -> "a different value"));
assertEquals(value, store.get(key));
assertEquals(value, store.getOrComputeIfAbsent(namespace, key, innerKey -> "a different value"));
assertEquals(value, store.get(namespace, key));
}

@Test
void nullIsAValidValueToPut() {
store.put(key, null);
store.put(namespace, key, null);

assertEquals(null, store.getOrComputeIfAbsent(key, innerKey -> "a different value"));
assertEquals(null, store.get(key));
assertEquals(null, store.getOrComputeIfAbsent(namespace, key, innerKey -> "a different value"));
assertEquals(null, store.get(namespace, key));
}

@Test
void keysCanBeRemoved() {
store.put(key, value);
store.remove(key);
store.put(namespace, key, value);
assertEquals(value, store.remove(namespace, key));

assertNull(store.get(key));
assertEquals("a different value", store.getOrComputeIfAbsent(key, innerKey -> "a different value"));
assertNull(store.get(namespace, key));
assertEquals("a different value",
store.getOrComputeIfAbsent(namespace, key, innerKey -> "a different value"));
}

@Test
void sameKeyWithDifferentNamespaces() {
Object value1 = createObject("value1");
Namespace namespace1 = Namespace.of("ns1");

Object value2 = createObject("value2");
Namespace namespace2 = Namespace.of("ns2");

store.put(namespace1, key, value1);
store.put(namespace2, key, value2);

assertEquals(value1, store.get(namespace1, key));
assertEquals(value2, store.get(namespace2, key));
}

@Test
void valueIsComputedIfAbsentInDifferentNamespace() {
Namespace namespace1 = Namespace.of("ns1");
Namespace namespace2 = Namespace.of("ns2");

assertEquals(value, store.getOrComputeIfAbsent(namespace1, key, innerKey -> value));
assertEquals(value, store.get(namespace1, key));

assertNull(store.get(namespace2, key));
}

@Test
void keyIsOnlyRemovedInGivenNamespace() {
Namespace namespace1 = Namespace.of("ns1");
Namespace namespace2 = Namespace.of("ns2");

Object value1 = createObject("value1");
Object value2 = createObject("value2");

store.put(namespace1, key, value1);
store.put(namespace2, key, value2);
store.remove(namespace1, key);

assertNull(store.get(namespace1, key));
assertEquals(value2, store.get(namespace2, key));
}

}
Expand All @@ -98,60 +143,52 @@ class InheritedValuesTests {

@Test
void valueFromParentIsVisible() {
parentStore.put(key, value);
assertEquals(value, store.get(key));
parentStore.put(namespace, key, value);
assertEquals(value, store.get(namespace, key));
}

@Test
void valueFromParentCanBeOverriddenInChild() {
parentStore.put(key, value);
parentStore.put(namespace, key, value);

Object otherValue = new Object();
store.put(key, otherValue);
assertEquals(otherValue, store.get(key));
store.put(namespace, key, otherValue);
assertEquals(otherValue, store.get(namespace, key));

assertEquals(value, parentStore.get(key));
assertEquals(value, parentStore.get(namespace, key));
}
}

@Nested
class UsingExplicitNamespaceTests {
class CompositNamespaceTests {

@Test
void sameKeyWithDifferentNamespaces() {
Object value1 = createObject("value1");
Namespace namespace1 = Namespace.sharedWith("ns1");
void additionNamespacePartMakesADifferenc() {

Namespace ns1 = Namespace.of("part1", "part2");
Namespace ns2 = Namespace.of("part1");
Namespace ns3 = Namespace.of("part1", "part2");

Object value2 = createObject("value2");
Namespace namespace2 = Namespace.sharedWith("ns2");

store.put(key, value1, namespace1);
store.put(key, value2, namespace2);
parentStore.put(ns1, key, value);
parentStore.put(ns2, key, value2);

assertEquals(value1, store.get(key, namespace1));
assertEquals(value2, store.get(key, namespace2));
assertEquals(value, store.get(ns1, key));
assertEquals(value, store.get(ns3, key));
assertEquals(value2, store.get(ns2, key));
}

@Test
void valueIsComputedIfAbsentInDifferentNamespace() {
Namespace namespace = Namespace.sharedWith("ns");
assertEquals(value, store.getOrComputeIfAbsent(key, innerKey -> value, namespace));
assertEquals(value, store.get(key, namespace));
void orderOfNamespacePartsDoesNotMatter() {

assertNull(store.get(key));
}

@Test
void keyIsOnlyRemovedInGivenNamespace() {
Namespace namespace = Namespace.sharedWith("ns");
Object valueInNamespace = createObject("valueInNamespace");
Namespace ns1 = Namespace.of("part1", "part2");
Namespace ns2 = Namespace.of("part2", "part1");

store.put(key, value);
store.put(key, valueInNamespace, namespace);
store.remove(key, namespace);
parentStore.put(ns1, key, value);

assertNull(store.get(key, namespace));
assertEquals(value, store.get(key));
assertEquals(value, store.get(ns1, key));
assertEquals(value, store.get(ns2, key));
}

}
Expand Down
Loading