Additional coroutine context tests
diff --git a/log4j-api-kotlin/src/test/kotlin/org.apache.logging.log4j.kotlin/ThreadContextTest.kt b/log4j-api-kotlin/src/test/kotlin/org.apache.logging.log4j.kotlin/ThreadContextTest.kt
index f6ed109..1b1d5fa 100644
--- a/log4j-api-kotlin/src/test/kotlin/org.apache.logging.log4j.kotlin/ThreadContextTest.kt
+++ b/log4j-api-kotlin/src/test/kotlin/org.apache.logging.log4j.kotlin/ThreadContextTest.kt
@@ -217,6 +217,16 @@
         assertEquals("myValue2", ContextMap["myKey2"])
         assertEquals(listOf("test", "test2"), ContextStack.view.asList())
       }
+      withAdditionalLoggingContext(mapOf("myKey3" to "myValue3"), listOf("test3")) {
+        assertEquals("myValue", ContextMap["myKey"])
+        assertEquals("myValue2", ContextMap["myKey2"])
+        assertEquals("myValue3", ContextMap["myKey3"])
+        assertEquals(listOf("test", "test2", "test3"), ContextStack.view.asList())
+      }
+      assertEquals("myValue", ContextMap["myKey"])
+      assertEquals("myValue2", ContextMap["myKey2"])
+      assertEquals(null, ContextMap["myKey3"])
+      assertEquals(listOf("test", "test2"), ContextStack.view.asList())
     }
     withLoggingContext(mapOf("myKey2" to "myValue2"), listOf("test2")) {
       assertEquals(null, ContextMap["myKey"])
@@ -227,6 +237,15 @@
         assertEquals("myValue2", ContextMap["myKey2"])
         assertEquals(listOf("test2"), ContextStack.view.asList())
       }
+      withLoggingContext(mapOf("myKey3" to "myValue3"), listOf("test3")) {
+        assertEquals(null, ContextMap["myKey"])
+        assertEquals(null, ContextMap["myKey2"])
+        assertEquals(listOf("test3"), ContextStack.view.asList())
+      }
+      assertEquals(null, ContextMap["myKey"])
+      assertEquals("myValue2", ContextMap["myKey2"])
+      assertEquals(null, ContextMap["myKey3"])
+      assertEquals(listOf("test2"), ContextStack.view.asList())
     }
   }
 
@@ -237,6 +256,13 @@
     withContext(CoroutineThreadContext(ThreadContextData(mapOf("myKey" to "myValue"), listOf("test")))) {
       assertEquals("myValue", ContextMap["myKey"])
       assertEquals("test", ContextStack.peek())
+      withContext(CoroutineThreadContext(ThreadContextData(mapOf("myKey2" to "myValue2"), listOf("test2")))) {
+        assertEquals(null, ContextMap["myKey"])
+        assertEquals("myValue2", ContextMap["myKey2"])
+        assertEquals(listOf("test2"), ContextStack.view.asList())
+      }
+      assertEquals("myValue", ContextMap["myKey"])
+      assertEquals("test", ContextStack.peek())
     }
     assertTrue(ContextMap.empty)
     assertTrue(ContextStack.empty)
@@ -244,6 +270,13 @@
     withContext(loggingContext(mapOf("myKey" to "myValue"), listOf("test"))) {
       assertEquals("myValue", ContextMap["myKey"])
       assertEquals("test", ContextStack.peek())
+      withContext(loggingContext(mapOf("myKey2" to "myValue2"), listOf("test2"))) {
+        assertEquals(null, ContextMap["myKey"])
+        assertEquals("myValue2", ContextMap["myKey2"])
+        assertEquals(listOf("test2"), ContextStack.view.asList())
+      }
+      assertEquals("myValue", ContextMap["myKey"])
+      assertEquals("test", ContextStack.peek())
     }
     assertTrue(ContextMap.empty)
     assertTrue(ContextStack.empty)
@@ -251,6 +284,52 @@
     withLoggingContext(mapOf("myKey" to "myValue"), listOf("test")) {
       assertEquals("myValue", ContextMap["myKey"])
       assertEquals("test", ContextStack.peek())
+      withLoggingContext(mapOf("myKey2" to "myValue2"), listOf("test2")) {
+        assertEquals(null, ContextMap["myKey"])
+        assertEquals("myValue2", ContextMap["myKey2"])
+        assertEquals(listOf("test2"), ContextStack.view.asList())
+      }
+      assertEquals("myValue", ContextMap["myKey"])
+      assertEquals("test", ContextStack.peek())
+    }
+    assertTrue(ContextMap.empty)
+    assertTrue(ContextStack.empty)
+
+    withAdditionalLoggingContext(mapOf("myKey" to "myValue"), listOf("test")) {
+      assertEquals("myValue", ContextMap["myKey"])
+      assertEquals("test", ContextStack.peek())
+      withAdditionalLoggingContext(mapOf("myKey2" to "myValue2"), listOf("test2")) {
+        assertEquals("myValue", ContextMap["myKey"])
+        assertEquals("myValue2", ContextMap["myKey2"])
+        assertEquals(listOf("test", "test2"), ContextStack.view.asList())
+      }
+      assertEquals("myValue", ContextMap["myKey"])
+      assertEquals(null, ContextMap["myKey2"])
+      assertEquals("test", ContextStack.peek())
+    }
+    assertTrue(ContextMap.empty)
+    assertTrue(ContextStack.empty)
+  }
+
+  @Test
+  fun `Can override existing context, and restore it`() = runBlocking {
+    assertTrue(ContextMap.empty)
+    assertTrue(ContextStack.empty)
+    withLoggingContext(mapOf("myKey" to "myValue", "myKey2" to "myValue2"), listOf("test1", "test2")) {
+      assertEquals(mapOf("myKey" to "myValue", "myKey2" to "myValue2"), ContextMap.view)
+      assertEquals(listOf("test1", "test2"), ContextStack.view.asList())
+      withLoggingContext(mapOf("myKey3" to "myValue3", "myKey4" to "myValue4"), listOf("test3", "test4")) {
+        assertEquals(mapOf("myKey3" to "myValue3", "myKey4" to "myValue4"), ContextMap.view)
+        assertEquals(listOf("test3", "test4"), ContextStack.view.asList())
+        withAdditionalLoggingContext(mapOf("myKey4" to "myValue4Modified", "myKey5" to "myValue5"), listOf("test5")) {
+          assertEquals(mapOf("myKey3" to "myValue3", "myKey4" to "myValue4Modified", "myKey5" to "myValue5"), ContextMap.view)
+          assertEquals(listOf("test3", "test4", "test5"), ContextStack.view.asList())
+        }
+        assertEquals(mapOf("myKey3" to "myValue3", "myKey4" to "myValue4"), ContextMap.view)
+        assertEquals(listOf("test3", "test4"), ContextStack.view.asList())
+      }
+      assertEquals(mapOf("myKey" to "myValue", "myKey2" to "myValue2"), ContextMap.view)
+      assertEquals(listOf("test1", "test2"), ContextStack.view.asList())
     }
     assertTrue(ContextMap.empty)
     assertTrue(ContextStack.empty)