test: Add FormatterTest.

Change-Id: Id627819583e8c9867b3950b7d8aac6830e5f3f80
diff --git a/core/pom.xml b/core/pom.xml
index cb61c20..a75acd5 100644
--- a/core/pom.xml
+++ b/core/pom.xml
@@ -42,6 +42,19 @@
       <artifactId>parsson</artifactId>
       <version>1.1.6</version>
     </dependency>
+
+    <dependency>
+      <groupId>org.junit.jupiter</groupId>
+      <artifactId>junit-jupiter-engine</artifactId>
+      <version>5.10.2</version>
+      <scope>test</scope>
+    </dependency>
+    <dependency>
+      <groupId>org.junit.jupiter</groupId>
+      <artifactId>junit-jupiter-api</artifactId>
+      <version>5.10.2</version>
+      <scope>test</scope>
+    </dependency>
   </dependencies>
 
   <build>
@@ -58,6 +71,11 @@
         </configuration>
       </plugin>
 
+      <plugin>
+        <artifactId>maven-surefire-plugin</artifactId>
+        <version>3.2.5</version>
+      </plugin>
+
     </plugins>
   </build>
 
diff --git a/core/src/test/java/eu/mulk/quarkus/googlecloud/jsonlogging/FormatterTest.java b/core/src/test/java/eu/mulk/quarkus/googlecloud/jsonlogging/FormatterTest.java
new file mode 100644
index 0000000..49cda39
--- /dev/null
+++ b/core/src/test/java/eu/mulk/quarkus/googlecloud/jsonlogging/FormatterTest.java
@@ -0,0 +1,88 @@
+package eu.mulk.quarkus.googlecloud.jsonlogging;
+
+import jakarta.json.Json;
+import org.jboss.logmanager.ExtLogRecord;
+import org.jboss.logmanager.Level;
+import org.junit.jupiter.api.Test;
+
+import java.util.Collection;
+import java.util.List;
+
+import static org.junit.jupiter.api.Assertions.assertLinesMatch;
+
+class FormatterTest {
+
+  @Test
+  void simpleRecord() {
+    var logRecord = new ExtLogRecord(Level.INFO, "Hello, world!", FormatterTest.class.getName());
+
+    var formatter = new Formatter(List.of(), List.of());
+    var formattingResult = formatter.format(logRecord);
+
+    assertLinesMatch(
+        List.of(
+            "\\{"
+                + "\"message\":\"Hello, world!\","
+                + "\"severity\":\"INFO\","
+                + "\"timestamp\":\\{\"seconds\":\\d+,\"nanos\":\\d+\\},"
+                + "\"logging.googleapis.com/sourceLocation\":"
+                + "\\{\"file\":\"ReflectionUtils.java\","
+                + "\"line\":\"\\d+\","
+                + "\"function\":\"org.junit.platform.commons.util.ReflectionUtils.invokeMethod\""
+                + "\\}"
+                + "\\}\n"),
+        List.of(formattingResult));
+  }
+
+  @Test
+  void structuredRecord() {
+    var parameterProvider =
+        new StructuredParameterProvider() {
+          @Override
+          public StructuredParameter getParameter() {
+            var b = Json.createObjectBuilder();
+            b.add("traceId", "39f9a49a9567a8bd7087b708f8932550");
+            b.add("spanId", "c7431b14630b633d");
+            return () -> b;
+          }
+        };
+
+    var labelProvider =
+        new LabelProvider() {
+          @Override
+          public Collection<Label> getLabels() {
+            return List.of(Label.of("requestId", "123"));
+          }
+        };
+
+    var logRecord = new ExtLogRecord(Level.INFO, "Hello, world!", FormatterTest.class.getName());
+    logRecord.setParameters(
+        new Object[] {
+          (StructuredParameter)
+              () -> Json.createObjectBuilder().add("one", 1).add("two", 2.0).add("yes", true),
+          Label.of("a", "b")
+        });
+
+    var formatter = new Formatter(List.of(parameterProvider), List.of(labelProvider));
+    var formattingResult = formatter.format(logRecord);
+    assertLinesMatch(
+        List.of(
+            "\\{"
+                + "\"logging.googleapis.com/labels\":\\{\"a\":\"b\",\"requestId\":\"123\"\\},"
+                + "\"message\":\"Hello, world!\","
+                + "\"severity\":\"INFO\","
+                + "\"timestamp\":\\{\"seconds\":\\d+,\"nanos\":\\d+\\},"
+                + "\"logging.googleapis.com/sourceLocation\":"
+                + "\\{\"file\":\"ReflectionUtils.java\","
+                + "\"line\":\"\\d+\","
+                + "\"function\":\"org.junit.platform.commons.util.ReflectionUtils.invokeMethod\""
+                + "\\},"
+                + "\"traceId\":\"39f9a49a9567a8bd7087b708f8932550\","
+                + "\"spanId\":\"c7431b14630b633d\","
+                + "\"one\":1,"
+                + "\"two\":2.0,"
+                + "\"yes\":true"
+                + "\\}\n"),
+        List.of(formattingResult));
+  }
+}