Add ManualCode unit tests for OnboardingPayloadParser (#29036)

diff --git a/src/controller/java/src/chip/onboardingpayload/OnboardingPayload.kt b/src/controller/java/src/chip/onboardingpayload/OnboardingPayload.kt
index 1d6f8ab..4d7cd01 100644
--- a/src/controller/java/src/chip/onboardingpayload/OnboardingPayload.kt
+++ b/src/controller/java/src/chip/onboardingpayload/OnboardingPayload.kt
@@ -158,6 +158,22 @@
       setupPinCode == other.setupPinCode
   }
 
+  override fun toString(): String {
+    return "OnboardingPayload(" +
+      "version=$version, " +
+      "vendorId=$vendorId, " +
+      "productId=$productId, " +
+      "commissioningFlow=$commissioningFlow, " +
+      "discoveryCapabilities=$discoveryCapabilities, " +
+      "discriminator=$discriminator, " +
+      "hasShortDiscriminator=$hasShortDiscriminator, " +
+      "setupPinCode=$setupPinCode, " +
+      "optionalQRCodeInfo=$optionalQRCodeInfo, " +
+      "optionalVendorData=$optionalVendorData, " +
+      "optionalExtensionData=$optionalExtensionData" +
+      ")"
+  }
+
   fun addOptionalQRCodeInfo(info: OptionalQRCodeInfo) {
     optionalQRCodeInfo[info.tag] = info
   }
diff --git a/src/controller/java/tests/chip/onboardingpayload/ManualCodeTest.kt b/src/controller/java/tests/chip/onboardingpayload/ManualCodeTest.kt
index 06dca30..51fb0bf 100644
--- a/src/controller/java/tests/chip/onboardingpayload/ManualCodeTest.kt
+++ b/src/controller/java/tests/chip/onboardingpayload/ManualCodeTest.kt
@@ -683,4 +683,79 @@
       productId = payload.productId
     )
   }
+
+  /*
+   * Test Parse Short Manual PairingCode to Expected Payload
+   */
+  @Test
+  fun testParseShortManualPairingCodeToExpectedPayload() {
+    // Payload: MT:W0GU2OTB00KA0648G00
+    // Setup Pin Code: 20202021
+    // Setup Discriminator: 15
+
+    val parser = OnboardingPayloadParser()
+    assertThat(parser.parseManualPairingCode("34970112332"))
+      .isEqualTo(
+        OnboardingPayload(
+          discriminator = 15,
+          setupPinCode = 20202021,
+          version = 0,
+          vendorId = 0,
+          productId = 0,
+          hasShortDiscriminator = true,
+          commissioningFlow = CommissioningFlow.STANDARD.value,
+          discoveryCapabilities = mutableSetOf(),
+        )
+      )
+  }
+
+  /*
+   * Test Parse Long Manual PairingCode to Expected Payload
+   */
+  @Test
+  fun testParseLongManualPairingCodeToExpectedPayload() {
+    // Payload: MT:W0GU2OTB00KA0648G00
+    // Vendor Id: 9050 (0x235A)
+    // Product Id: 17729 (0x4541)
+    // Setup Pin Code: 20202021
+    // Setup Discriminator: 15
+
+    val parser = OnboardingPayloadParser()
+    assertThat(parser.parseManualPairingCode("749701123309050177298"))
+      .isEqualTo(
+        OnboardingPayload(
+          discriminator = 15,
+          setupPinCode = 20202021,
+          version = 0,
+          vendorId = 0x235A,
+          productId = 0x4541,
+          hasShortDiscriminator = true,
+          commissioningFlow = CommissioningFlow.CUSTOM.value,
+          discoveryCapabilities = mutableSetOf(),
+        )
+      )
+  }
+
+  /*
+   * Test Generate Manual PairingCode to Expected Payload
+   */
+  @Test
+  fun testGenerateManualPairingCodetoExpectedPayload() {
+    val parser = OnboardingPayloadParser()
+    assertThat(
+        parser.getManualPairingCodeFromPayload(
+          OnboardingPayload(
+            discriminator = 15,
+            setupPinCode = 20202021,
+            version = 0,
+            vendorId = 0x235A,
+            productId = 0x4541,
+            hasShortDiscriminator = true,
+            commissioningFlow = CommissioningFlow.CUSTOM.value,
+            discoveryCapabilities = mutableSetOf(),
+          )
+        )
+      )
+      .isEqualTo("749701123309050177298")
+  }
 }