Merge changes I47650901,Ifaf6f745,I7586b144 into androidx-main

* changes:
  Update criteria for required arguments
  Make addInDefaultArg bypass unknown default values
  Improve deeplink parse result readability
diff --git a/navigation/navigation-common/src/androidTest/java/androidx/navigation/AddInDefaultArgsTest.kt b/navigation/navigation-common/src/androidTest/java/androidx/navigation/AddInDefaultArgsTest.kt
index f1ae7b9..4e5d562 100644
--- a/navigation/navigation-common/src/androidTest/java/androidx/navigation/AddInDefaultArgsTest.kt
+++ b/navigation/navigation-common/src/androidTest/java/androidx/navigation/AddInDefaultArgsTest.kt
@@ -19,6 +19,7 @@
 import android.os.Bundle
 import androidx.navigation.test.floatArgument
 import androidx.navigation.test.intArgument
+import androidx.navigation.test.intArgumentUnknownDefault
 import androidx.navigation.test.longArgument
 import androidx.navigation.test.nullableStringArgument
 import androidx.navigation.test.referenceArgument
@@ -38,6 +39,7 @@
 private val floatArgumentWithDefault = "floatArg" to floatArgument(123f)
 private val referenceArgumentWithDefault = "referenceArg" to referenceArgument(123)
 private val stringArrayArgumentWithDefault = "stringArrayArg" to stringArrayArgument(null)
+private val intArgumentWithUnknownDefault = "intUnknownArg" to intArgumentUnknownDefault()
 
 @SmallTest
 @RunWith(Parameterized::class)
@@ -65,7 +67,11 @@
                 // Test with arguments that have default values (reference)
                 mapOf(stringArgumentWithDefault, referenceArgumentWithDefault),
                 // Test with arguments that have default values (string array)
-                mapOf(stringArgumentWithDefault, stringArrayArgumentWithDefault)
+                mapOf(stringArgumentWithDefault, stringArrayArgumentWithDefault),
+                // Test with argument that only have unknown default value
+                mapOf(intArgumentWithUnknownDefault),
+                // Test with arguments where only some have unknown default values
+                mapOf(intArgumentWithUnknownDefault, stringArgumentWithDefault)
 
             ).forEach { arguments: Map<String, NavArgument> ->
                 // Run with a null Bundle
diff --git a/navigation/navigation-common/src/androidTest/java/androidx/navigation/NavArgumentTest.kt b/navigation/navigation-common/src/androidTest/java/androidx/navigation/NavArgumentTest.kt
index d6b19e3..202b3b3 100644
--- a/navigation/navigation-common/src/androidTest/java/androidx/navigation/NavArgumentTest.kt
+++ b/navigation/navigation-common/src/androidTest/java/androidx/navigation/NavArgumentTest.kt
@@ -66,7 +66,7 @@
     }
 
     @Test
-    fun setDefaultValuePresent() {
+    fun setUnknownDefaultValuePresent() {
         val argument = NavArgument.Builder()
             .setType(NavType.IntType)
             .setIsNullable(false)
@@ -74,5 +74,6 @@
             .build()
 
         assertThat(argument.isDefaultValuePresent).isTrue()
+        assertThat(argument.isDefaultValueUnknown).isTrue()
     }
 }
diff --git a/navigation/navigation-common/src/androidTest/java/androidx/navigation/NavDeepLinkTest.kt b/navigation/navigation-common/src/androidTest/java/androidx/navigation/NavDeepLinkTest.kt
index 2d76f1d..33bab05 100644
--- a/navigation/navigation-common/src/androidTest/java/androidx/navigation/NavDeepLinkTest.kt
+++ b/navigation/navigation-common/src/androidTest/java/androidx/navigation/NavDeepLinkTest.kt
@@ -18,7 +18,9 @@
 
 import android.net.Uri
 import androidx.navigation.test.intArgument
+import androidx.navigation.test.intArgumentUnknownDefault
 import androidx.navigation.test.nullableStringArgument
+import androidx.navigation.test.nullableStringArgumentUnknownDefault
 import androidx.navigation.test.stringArgument
 import androidx.navigation.test.stringArrayArgument
 import androidx.test.filters.SmallTest
@@ -1311,6 +1313,32 @@
     }
 
     @Test
+    fun deepLinkMissingRequiredArgumentUnknownDefault() {
+        val deepLink = NavDeepLink("$DEEP_LINK_EXACT_HTTPS?myarg={myarg}")
+        val matchArgs = deepLink.getMatchingArguments(
+            Uri.parse(DEEP_LINK_EXACT_HTTPS),
+            // NavArgument with unknown default value
+            mapOf("myarg" to intArgumentUnknownDefault())
+        )
+        assertWithMessage("Args should not be null")
+            .that(matchArgs)
+            .isNotNull()
+    }
+
+    @Test
+    fun deepLinkMissingNullableArgumentUnknownDefault() {
+        val deepLink = NavDeepLink("$DEEP_LINK_EXACT_HTTPS?myarg={myarg}")
+        val matchArgs = deepLink.getMatchingArguments(
+            Uri.parse(DEEP_LINK_EXACT_HTTPS),
+            // NavArgument with unknown default value
+            mapOf("myarg" to nullableStringArgumentUnknownDefault())
+        )
+        assertWithMessage("Args should not be null")
+            .that(matchArgs)
+            .isNotNull()
+    }
+
+    @Test
     fun deepLinkMissingRequiredArgument() {
         val deepLinkString = "$DEEP_LINK_EXACT_HTTPS/greeting?title={title}&text={text}"
         val deepLink = NavDeepLink(deepLinkString)
diff --git a/navigation/navigation-common/src/androidTest/java/androidx/navigation/NavDestinationBuilderTest.kt b/navigation/navigation-common/src/androidTest/java/androidx/navigation/NavDestinationBuilderTest.kt
index 860d0a9..ff9d14c 100644
--- a/navigation/navigation-common/src/androidTest/java/androidx/navigation/NavDestinationBuilderTest.kt
+++ b/navigation/navigation-common/src/androidTest/java/androidx/navigation/NavDestinationBuilderTest.kt
@@ -100,9 +100,12 @@
         assertWithMessage("NavDestination should have argument added")
             .that(destination.arguments["arg"])
             .isNotNull()
-        assertWithMessage("NavArgument should have default value added")
+        assertWithMessage("NavArgument should have not have known default value added")
             .that(destination.arguments["arg2"]?.isDefaultValuePresent)
             .isTrue()
+        assertWithMessage("NavArgument should have unknown default value added")
+            .that(destination.arguments["arg2"]?.isDefaultValueUnknown)
+            .isTrue()
     }
 
     @Test
@@ -192,7 +195,7 @@
     }
 
     @Test
-    fun navDestinationDefaultValuePresent() {
+    fun navDestinationUnknownDefaultValuePresent() {
         val destination = provider.navDestination(DESTINATION_ID) {
             argument("arg1") {
                 type = NavType.StringType
@@ -205,9 +208,11 @@
         }
         val arg1 = destination.arguments["arg1"]
         assertThat(arg1?.isDefaultValuePresent).isTrue()
+        assertThat(arg1?.isDefaultValueUnknown).isTrue()
 
         val arg2 = destination.arguments["arg2"]
         assertThat(arg2?.isDefaultValuePresent).isFalse()
+        assertThat(arg2?.isDefaultValueUnknown).isFalse()
     }
 }
 
diff --git a/navigation/navigation-common/src/androidTest/java/androidx/navigation/test/NavArgument.kt b/navigation/navigation-common/src/androidTest/java/androidx/navigation/test/NavArgument.kt
index a0e4450..d27398f 100644
--- a/navigation/navigation-common/src/androidTest/java/androidx/navigation/test/NavArgument.kt
+++ b/navigation/navigation-common/src/androidTest/java/androidx/navigation/test/NavArgument.kt
@@ -32,6 +32,11 @@
 ) = NavArgument.Builder().setType(IntType)
     .setDefaultValue(defaultValue)
     .build()
+
+fun intArgumentUnknownDefault() =
+    NavArgument.Builder().setType(IntType)
+    .setUnknownDefaultValuePresent(true)
+    .build()
 // endregion
 
 // region LongType
@@ -85,6 +90,11 @@
     .setIsNullable(true)
     .setDefaultValue(defaultValue)
     .build()
+
+fun nullableStringArgumentUnknownDefault() = NavArgument.Builder().setType(StringType)
+    .setIsNullable(true)
+    .setUnknownDefaultValuePresent(true)
+    .build()
 // endregion
 
 // region StringArrayType
diff --git a/navigation/navigation-common/src/main/java/androidx/navigation/NavArgument.kt b/navigation/navigation-common/src/main/java/androidx/navigation/NavArgument.kt
index 2239fdc..cd4d1d8 100644
--- a/navigation/navigation-common/src/main/java/androidx/navigation/NavArgument.kt
+++ b/navigation/navigation-common/src/main/java/androidx/navigation/NavArgument.kt
@@ -52,6 +52,12 @@
     public val isDefaultValuePresent: Boolean
 
     /**
+     * Indicates whether the default value (if present) is unknown (i.e. safe args where
+     * default value is declared in KClass but not stored in [defaultValue]).
+     */
+    internal val isDefaultValueUnknown: Boolean
+
+    /**
      * The default value of this argument or `null` if it doesn't have a default value.
      * Use [isDefaultValuePresent] to distinguish between `null` and absence of a value.
      * @return The default value assigned to this argument.
@@ -205,6 +211,7 @@
         this.isNullable = isNullable
         this.defaultValue = defaultValue
         isDefaultValuePresent = defaultValuePresent || unknownDefaultValuePresent
+        isDefaultValueUnknown = unknownDefaultValuePresent
     }
 }
 
@@ -219,9 +226,8 @@
     isArgumentMissing: (key: String) -> Boolean
 ): List<String> {
     val requiredArgumentKeys = filterValues {
-        if (it != null) {
-            !it.isNullable && !it.isDefaultValuePresent
-        } else false
+        !it?.isNullable!! && !it.isDefaultValuePresent
     }.keys
+
     return requiredArgumentKeys.filter { key -> isArgumentMissing(key) }
 }
diff --git a/navigation/navigation-common/src/main/java/androidx/navigation/NavDeepLink.kt b/navigation/navigation-common/src/main/java/androidx/navigation/NavDeepLink.kt
index 6377f8e..811319e 100644
--- a/navigation/navigation-common/src/main/java/androidx/navigation/NavDeepLink.kt
+++ b/navigation/navigation-common/src/main/java/androidx/navigation/NavDeepLink.kt
@@ -226,10 +226,9 @@
             val value = Uri.decode(matcher.group(index + 1))
             val argument = arguments[argumentName]
             try {
-                if (parseArgument(bundle, argumentName, value, argument)) {
-                    return
-                }
+                parseArgument(bundle, argumentName, value, argument)
             } catch (e: IllegalArgumentException) {
+                // parse failed, quick return
                 return
             }
         }
@@ -244,9 +243,7 @@
             val value = Uri.decode(matcher.group(index + 1))
             val argument = arguments[argumentName]
             try {
-                if (parseArgument(bundle, argumentName, value, argument)) {
-                    return false
-                }
+                parseArgument(bundle, argumentName, value, argument)
             } catch (e: IllegalArgumentException) {
                 // Failed to parse means this isn't a valid deep link
                 // for the given URI - i.e., the URI contains a non-integer
@@ -254,6 +251,7 @@
                 return false
             }
         }
+        // parse success
         return true
     }
 
@@ -276,9 +274,11 @@
                 }
             }
             if (!parseInputParams(inputParams, storedParam, bundle, arguments)) {
+                // failed to parse input parameters
                 return false
             }
         }
+        // parse success
         return true
     }
 
@@ -307,9 +307,7 @@
                         // Passing in a value the exact same as the placeholder will be treated the
                         // as if no value was passed (unless value is based on String),
                         // being replaced if it is optional or throwing an error if it is required.
-                        if (parseArgument(queryParamBundle, argName, value, argument)) {
-                            return false
-                        }
+                        parseArgument(queryParamBundle, argName, value, argument)
                     }
                 }
                 bundle.putAll(queryParamBundle)
@@ -319,6 +317,7 @@
                 // that particular parameter from the argument bundle.
             }
         }
+        // parse success
         return true
     }
 
@@ -332,19 +331,22 @@
         return matches.size
     }
 
+    /**
+     * Parses [value] based on the NavArgument's NavType and stores the result
+     * inside the [bundle]. Throws if parse fails.
+     */
     private fun parseArgument(
         bundle: Bundle,
         name: String,
         value: String,
         argument: NavArgument?
-    ): Boolean {
+    ) {
         if (argument != null) {
             val type = argument.type
             type.parseAndPut(bundle, name, value)
         } else {
             bundle.putString(name, value)
         }
-        return false
     }
 
     private fun parseArgumentForRepeatedParam(
diff --git a/navigation/navigation-common/src/main/java/androidx/navigation/NavDestination.kt b/navigation/navigation-common/src/main/java/androidx/navigation/NavDestination.kt
index c673594..30726b3 100644
--- a/navigation/navigation-common/src/main/java/androidx/navigation/NavDestination.kt
+++ b/navigation/navigation-common/src/main/java/androidx/navigation/NavDestination.kt
@@ -587,7 +587,7 @@
     @Suppress("NullableCollection") // Needed for nullable bundle
     @RestrictTo(RestrictTo.Scope.LIBRARY_GROUP)
     public fun addInDefaultArgs(args: Bundle?): Bundle? {
-        if (args == null && _arguments.isNullOrEmpty()) {
+        if (args == null && _arguments.isEmpty()) {
             return null
         }
         val defaultArgs = Bundle()
@@ -596,10 +596,14 @@
         }
         if (args != null) {
             defaultArgs.putAll(args)
+            // Don't verify unknown default values - these default values are only available
+            // during deserialization for safe args.
             for ((key, value) in _arguments) {
-                require(value.verify(key, defaultArgs)) {
-                    "Wrong argument type for '$key' in argument bundle. ${value.type.name} " +
-                        "expected."
+                if (!value.isDefaultValueUnknown) {
+                    require(value.verify(key, defaultArgs)) {
+                        "Wrong argument type for '$key' in argument bundle. ${value.type.name} " +
+                            "expected."
+                    }
                 }
             }
         }
diff --git a/navigation/navigation-common/src/test/java/androidx/navigation/serialization/NavArgumentGeneratorTest.kt b/navigation/navigation-common/src/test/java/androidx/navigation/serialization/NavArgumentGeneratorTest.kt
index a277965..391d320 100644
--- a/navigation/navigation-common/src/test/java/androidx/navigation/serialization/NavArgumentGeneratorTest.kt
+++ b/navigation/navigation-common/src/test/java/androidx/navigation/serialization/NavArgumentGeneratorTest.kt
@@ -48,7 +48,7 @@
             nullable = false
         }
         assertThat(converted).containsExactlyInOrder(expected)
-        assertThat(converted[0].argument.isDefaultValuePresent).isFalse()
+        assertThat(converted[0].argument.isDefaultValueUnknown).isFalse()
     }
 
     @Test
@@ -71,7 +71,7 @@
             nullable = false
         }
         assertThat(converted).containsExactlyInOrder(expected)
-        assertThat(converted[0].argument.isDefaultValuePresent).isFalse()
+        assertThat(converted[0].argument.isDefaultValueUnknown).isFalse()
     }
 
     @Test
@@ -84,7 +84,7 @@
             nullable = true
         }
         assertThat(converted).containsExactlyInOrder(expected)
-        assertThat(converted[0].argument.isDefaultValuePresent).isFalse()
+        assertThat(converted[0].argument.isDefaultValueUnknown).isFalse()
     }
 
     @Test
@@ -97,7 +97,7 @@
             nullable = false
         }
         assertThat(converted).containsExactlyInOrder(expected)
-        assertThat(converted[0].argument.isDefaultValuePresent).isFalse()
+        assertThat(converted[0].argument.isDefaultValueUnknown).isFalse()
     }
 
     @Test
@@ -120,7 +120,7 @@
             nullable = false
         }
         assertThat(converted).containsExactlyInOrder(expected)
-        assertThat(converted[0].argument.isDefaultValuePresent).isFalse()
+        assertThat(converted[0].argument.isDefaultValueUnknown).isFalse()
     }
 
     @Test
@@ -143,7 +143,7 @@
             nullable = false
         }
         assertThat(converted).containsExactlyInOrder(expected)
-        assertThat(converted[0].argument.isDefaultValuePresent).isFalse()
+        assertThat(converted[0].argument.isDefaultValueUnknown).isFalse()
     }
 
     @Test
@@ -166,7 +166,7 @@
             nullable = false
         }
         assertThat(converted).containsExactlyInOrder(expected)
-        assertThat(converted[0].argument.isDefaultValuePresent).isFalse()
+        assertThat(converted[0].argument.isDefaultValueUnknown).isFalse()
     }
 
     @Test
@@ -179,7 +179,7 @@
             nullable = true
         }
         assertThat(converted).containsExactlyInOrder(expected)
-        assertThat(converted[0].argument.isDefaultValuePresent).isFalse()
+        assertThat(converted[0].argument.isDefaultValueUnknown).isFalse()
     }
 
     @Test
@@ -192,7 +192,7 @@
             nullable = false
         }
         assertThat(converted).containsExactlyInOrder(expected)
-        assertThat(converted[0].argument.isDefaultValuePresent).isFalse()
+        assertThat(converted[0].argument.isDefaultValueUnknown).isFalse()
     }
 
     @Test
@@ -205,7 +205,7 @@
             nullable = true
         }
         assertThat(converted).containsExactlyInOrder(expected)
-        assertThat(converted[0].argument.isDefaultValuePresent).isFalse()
+        assertThat(converted[0].argument.isDefaultValueUnknown).isFalse()
     }
 
     @Test
@@ -218,7 +218,7 @@
             nullable = false
         }
         assertThat(converted).containsExactlyInOrder(expected)
-        assertThat(converted[0].argument.isDefaultValuePresent).isFalse()
+        assertThat(converted[0].argument.isDefaultValueUnknown).isFalse()
     }
 
     @Test
@@ -231,7 +231,7 @@
             nullable = true
         }
         assertThat(converted).containsExactlyInOrder(expected)
-        assertThat(converted[0].argument.isDefaultValuePresent).isFalse()
+        assertThat(converted[0].argument.isDefaultValueUnknown).isFalse()
     }
 
     @Test
@@ -244,7 +244,7 @@
             nullable = false
         }
         assertThat(converted).containsExactlyInOrder(expected)
-        assertThat(converted[0].argument.isDefaultValuePresent).isFalse()
+        assertThat(converted[0].argument.isDefaultValueUnknown).isFalse()
     }
 
     @Test
@@ -257,7 +257,7 @@
             nullable = true
         }
         assertThat(converted).containsExactlyInOrder(expected)
-        assertThat(converted[0].argument.isDefaultValuePresent).isFalse()
+        assertThat(converted[0].argument.isDefaultValueUnknown).isFalse()
     }
 
     @Test
@@ -270,7 +270,7 @@
             nullable = false
         }
         assertThat(converted).containsExactlyInOrder(expected)
-        assertThat(converted[0].argument.isDefaultValuePresent).isFalse()
+        assertThat(converted[0].argument.isDefaultValueUnknown).isFalse()
     }
 
     @Test
@@ -283,7 +283,7 @@
             nullable = true
         }
         assertThat(converted).containsExactlyInOrder(expected)
-        assertThat(converted[0].argument.isDefaultValuePresent).isFalse()
+        assertThat(converted[0].argument.isDefaultValueUnknown).isFalse()
     }
 
     @Test
@@ -311,7 +311,7 @@
             nullable = false
         }
         assertThat(converted).containsExactlyInOrder(expected)
-        assertThat(converted[0].argument.isDefaultValuePresent).isFalse()
+        assertThat(converted[0].argument.isDefaultValueUnknown).isFalse()
     }
 
     @Test
@@ -339,7 +339,7 @@
             nullable = true
         }
         assertThat(converted).containsExactlyInOrder(expected)
-        assertThat(converted[0].argument.isDefaultValuePresent).isFalse()
+        assertThat(converted[0].argument.isDefaultValueUnknown).isFalse()
     }
 
     @Test
@@ -366,7 +366,7 @@
             nullable = false
         }
         assertThat(converted).containsExactlyInOrder(expected)
-        assertThat(converted[0].argument.isDefaultValuePresent).isFalse()
+        assertThat(converted[0].argument.isDefaultValueUnknown).isFalse()
     }
 
     @Test
@@ -393,7 +393,7 @@
             nullable = true
         }
         assertThat(converted).containsExactlyInOrder(expected)
-        assertThat(converted[0].argument.isDefaultValuePresent).isFalse()
+        assertThat(converted[0].argument.isDefaultValueUnknown).isFalse()
     }
 
     @Test
@@ -417,7 +417,7 @@
             nullable = false
         }
         assertThat(converted).containsExactlyInOrder(expected)
-        assertThat(converted[0].argument.isDefaultValuePresent).isFalse()
+        assertThat(converted[0].argument.isDefaultValueUnknown).isFalse()
     }
 
     @Test
@@ -441,7 +441,7 @@
             nullable = true
         }
         assertThat(converted).containsExactlyInOrder(expected)
-        assertThat(converted[0].argument.isDefaultValuePresent).isFalse()
+        assertThat(converted[0].argument.isDefaultValueUnknown).isFalse()
     }
 
     @Test
@@ -465,7 +465,7 @@
             nullable = false
         }
         assertThat(converted).containsExactlyInOrder(expected)
-        assertThat(converted[0].argument.isDefaultValuePresent).isFalse()
+        assertThat(converted[0].argument.isDefaultValueUnknown).isFalse()
     }
 
     @Test
@@ -489,7 +489,7 @@
             nullable = true
         }
         assertThat(converted).containsExactlyInOrder(expected)
-        assertThat(converted[0].argument.isDefaultValuePresent).isFalse()
+        assertThat(converted[0].argument.isDefaultValueUnknown).isFalse()
     }
 
     @Test
@@ -510,7 +510,7 @@
             mapOf(typeOf<TestEnum>() to navType)
         )
         assertThat(converted).containsExactlyInOrder(expected)
-        assertThat(converted[0].argument.isDefaultValuePresent).isFalse()
+        assertThat(converted[0].argument.isDefaultValueUnknown).isFalse()
     }
 
     @Test
@@ -533,7 +533,7 @@
             nullable = true
         }
         assertThat(converted).containsExactlyInOrder(expected)
-        assertThat(converted[0].argument.isDefaultValuePresent).isFalse()
+        assertThat(converted[0].argument.isDefaultValueUnknown).isFalse()
     }
 
     @Test
@@ -554,7 +554,7 @@
             nullable = false
         }
         assertThat(converted).containsExactlyInOrder(expected)
-        assertThat(converted[0].argument.isDefaultValuePresent).isFalse()
+        assertThat(converted[0].argument.isDefaultValueUnknown).isFalse()
     }
 
     @Test
@@ -567,7 +567,7 @@
             unknownDefaultValuePresent = true
         }
         assertThat(converted).containsExactlyInOrder(expected)
-        assertThat(converted[0].argument.isDefaultValuePresent).isTrue()
+        assertThat(converted[0].argument.isDefaultValueUnknown).isTrue()
     }
 
     @Test
@@ -581,7 +581,7 @@
             // since String? is nullable, we cannot know for sure the default value is not null
         }
         assertThat(converted).containsExactlyInOrder(expected)
-        assertThat(converted[0].argument.isDefaultValuePresent).isTrue()
+        assertThat(converted[0].argument.isDefaultValueUnknown).isTrue()
     }
 
     @Test
@@ -594,7 +594,7 @@
             unknownDefaultValuePresent = true
         }
         assertThat(converted).containsExactlyInOrder(expected)
-        assertThat(converted[0].argument.isDefaultValuePresent).isTrue()
+        assertThat(converted[0].argument.isDefaultValueUnknown).isTrue()
     }
 
     @Test
@@ -629,7 +629,7 @@
             nullable = false
         }
         assertThat(converted).containsExactlyInOrder(expected)
-        assertThat(converted[0].argument.isDefaultValuePresent).isFalse()
+        assertThat(converted[0].argument.isDefaultValueUnknown).isFalse()
     }
 
     @Test
@@ -650,7 +650,7 @@
             nullable = true
         }
         assertThat(converted).containsExactlyInOrder(expected)
-        assertThat(converted[0].argument.isDefaultValuePresent).isFalse()
+        assertThat(converted[0].argument.isDefaultValueUnknown).isFalse()
     }
 
     @Test
@@ -689,8 +689,8 @@
             nullable = true
         }
         assertThat(converted).containsExactlyInOrder(expectedInt, expectedString)
-        assertThat(converted[0].argument.isDefaultValuePresent).isFalse()
-        assertThat(converted[1].argument.isDefaultValuePresent).isFalse()
+        assertThat(converted[0].argument.isDefaultValueUnknown).isFalse()
+        assertThat(converted[1].argument.isDefaultValueUnknown).isFalse()
     }
 
     @Test
@@ -709,8 +709,8 @@
             unknownDefaultValuePresent = true
         }
         assertThat(converted).containsExactlyInOrder(expectedInt, expectedString)
-        assertThat(converted[0].argument.isDefaultValuePresent).isTrue()
-        assertThat(converted[1].argument.isDefaultValuePresent).isTrue()
+        assertThat(converted[0].argument.isDefaultValueUnknown).isTrue()
+        assertThat(converted[1].argument.isDefaultValueUnknown).isTrue()
     }
 
     @Test
@@ -743,8 +743,8 @@
             nullable = false
         }
         assertThat(converted).containsExactlyInOrder(expectedStringList, expectedIntList)
-        assertThat(converted[0].argument.isDefaultValuePresent).isFalse()
-        assertThat(converted[1].argument.isDefaultValuePresent).isFalse()
+        assertThat(converted[0].argument.isDefaultValueUnknown).isFalse()
+        assertThat(converted[1].argument.isDefaultValueUnknown).isFalse()
     }
 
     @Test
@@ -782,8 +782,8 @@
             unknownDefaultValuePresent = true
         }
         assertThat(converted).containsExactlyInOrder(expectedStringList, expectedIntList)
-        assertThat(converted[0].argument.isDefaultValuePresent).isTrue()
-        assertThat(converted[1].argument.isDefaultValuePresent).isTrue()
+        assertThat(converted[0].argument.isDefaultValueUnknown).isTrue()
+        assertThat(converted[1].argument.isDefaultValueUnknown).isTrue()
     }
 
     @Test
@@ -804,7 +804,7 @@
             nullable = false
         }
         assertThat(converted).containsExactlyInOrder(expectedStringList)
-        assertThat(converted[0].argument.isDefaultValuePresent).isFalse()
+        assertThat(converted[0].argument.isDefaultValueUnknown).isFalse()
     }
 
     @Test
@@ -830,8 +830,8 @@
         }
 
         assertThat(converted).containsExactlyInOrder(expectedString, expectedIntList)
-        assertThat(converted[0].argument.isDefaultValuePresent).isFalse()
-        assertThat(converted[1].argument.isDefaultValuePresent).isFalse()
+        assertThat(converted[0].argument.isDefaultValueUnknown).isFalse()
+        assertThat(converted[1].argument.isDefaultValueUnknown).isFalse()
     }
 
     @Test
@@ -853,7 +853,7 @@
         }
         assertThat(converted).containsExactlyInOrder(expected)
         assertThat(converted[0]).isNotEqualTo(NavType.IntType)
-        assertThat(converted[0].argument.isDefaultValuePresent).isFalse()
+        assertThat(converted[0].argument.isDefaultValueUnknown).isFalse()
     }
 
     @Test
@@ -882,7 +882,7 @@
             unknownDefaultValuePresent = true
         }
         assertThat(converted).containsExactlyInOrder(expected)
-        assertThat(converted[0].argument.isDefaultValuePresent).isTrue()
+        assertThat(converted[0].argument.isDefaultValueUnknown).isTrue()
     }
 
     @Test
@@ -981,6 +981,7 @@
         if (javaClass != other.javaClass) return false
         if (isNullable != other.isNullable) return false
         if (isDefaultValuePresent != other.isDefaultValuePresent) return false
+        if (isDefaultValueUnknown != other.isDefaultValueUnknown) return false
         if (type != other.type) return false
         // In context of serialization, we can only tell if defaultValue is present but don't know
         // actual value, so we cannot compare it to the generated defaultValue. But if