diff --git a/packages/quicktype-core/src/language/CPlusPlus/CPlusPlusRenderer.ts b/packages/quicktype-core/src/language/CPlusPlus/CPlusPlusRenderer.ts index 289d2652ae..ec99e8029b 100644 --- a/packages/quicktype-core/src/language/CPlusPlus/CPlusPlusRenderer.ts +++ b/packages/quicktype-core/src/language/CPlusPlus/CPlusPlusRenderer.ts @@ -2144,8 +2144,14 @@ export class CPlusPlusRenderer extends ConvenienceRenderer { ], false, () => { + // A JSON null must become an *empty* + // optional. Only `optType()` guarantees + // that: the factory would wrap a + // default-constructed T (std::make_optional + // and std::make_shared both do), turning + // null into 0/""/{} on round-trip. this.emitLine( - `if (j.is_null()) return ${factory}(); else return ${factory}(j.get());`, + `if (j.is_null()) return ${optType}(); else return ${factory}(j.get());`, ); }, ); diff --git a/packages/quicktype-core/src/language/CPlusPlus/language.ts b/packages/quicktype-core/src/language/CPlusPlus/language.ts index e614e7ec9e..cca4dd10be 100644 --- a/packages/quicktype-core/src/language/CPlusPlus/language.ts +++ b/packages/quicktype-core/src/language/CPlusPlus/language.ts @@ -104,7 +104,7 @@ export const cPlusPlusOptions = { boost: new BooleanOption( "boost", "Require a dependency on boost. Without boost, C++17 is required", - true, + false, ), hideNullOptional: new BooleanOption( "hide-null-optional", diff --git a/packages/quicktype-core/src/language/CSharp/CSharpRenderer.ts b/packages/quicktype-core/src/language/CSharp/CSharpRenderer.ts index 3e331a310b..482cb14f71 100644 --- a/packages/quicktype-core/src/language/CSharp/CSharpRenderer.ts +++ b/packages/quicktype-core/src/language/CSharp/CSharpRenderer.ts @@ -15,11 +15,11 @@ import { type Sourcelike, maybeAnnotated } from "../../Source.js"; import { assert } from "../../support/Support.js"; import type { TargetLanguage } from "../../TargetLanguage.js"; import { followTargetType } from "../../Transformers.js"; -import type { - ClassProperty, - ClassType, - EnumType, - Type, +import { + type ClassProperty, + type ClassType, + type EnumType, + type Type, UnionType, } from "../../Type/index.js"; import { @@ -187,6 +187,18 @@ export class CSharpRenderer extends ConvenienceRenderer { withIssues = false, ): Sourcelike { t = followTargetType(t); + // A nullable union already renders with its own "?" through + // csType's union case; unwrap it so the annotation is applied + // exactly once. Without this, an optional property whose type + // is e.g. `string | null` would render as `string??` at C# 8 + // (and a nullable value-type union as `long??` at any version). + if (t instanceof UnionType) { + const nullable = nullableFromUnion(t); + if (nullable !== null) { + t = followTargetType(nullable); + } + } + const csType = this.csType(t, follow, withIssues); if (isValueType(t) || this._csOptions.version >= 8) { return [csType, "?"]; diff --git a/packages/quicktype-core/src/language/CSharp/NewtonSoftCSharpRenderer.ts b/packages/quicktype-core/src/language/CSharp/NewtonSoftCSharpRenderer.ts index 1993f6e135..b4aebaf7a2 100644 --- a/packages/quicktype-core/src/language/CSharp/NewtonSoftCSharpRenderer.ts +++ b/packages/quicktype-core/src/language/CSharp/NewtonSoftCSharpRenderer.ts @@ -197,7 +197,10 @@ export class NewtonsoftCSharpRenderer extends CSharpRenderer { this.emitLine("#pragma warning restore CS8618"); this.emitLine("#pragma warning restore CS8601"); + this.emitLine("#pragma warning restore CS8602"); this.emitLine("#pragma warning restore CS8603"); + this.emitLine("#pragma warning restore CS8604"); + this.emitLine("#pragma warning restore CS8625"); this.emitLine("#pragma warning restore CS8765"); } @@ -239,7 +242,13 @@ export class NewtonsoftCSharpRenderer extends CSharpRenderer { this.emitLine("#nullable enable"); this.emitLine("#pragma warning disable CS8618"); this.emitLine("#pragma warning disable CS8601"); + // CS8602/CS8604/CS8625: the emitted constraint-check and + // string-transformer helpers dereference and pass around + // Deserialize() results, which are nullable under NRT. + this.emitLine("#pragma warning disable CS8602"); this.emitLine("#pragma warning disable CS8603"); + this.emitLine("#pragma warning disable CS8604"); + this.emitLine("#pragma warning disable CS8625"); this.emitLine("#pragma warning disable CS8765"); } } diff --git a/packages/quicktype-core/src/language/CSharp/SystemTextJsonCSharpRenderer.ts b/packages/quicktype-core/src/language/CSharp/SystemTextJsonCSharpRenderer.ts index e64a915dcb..f3eccc8df4 100644 --- a/packages/quicktype-core/src/language/CSharp/SystemTextJsonCSharpRenderer.ts +++ b/packages/quicktype-core/src/language/CSharp/SystemTextJsonCSharpRenderer.ts @@ -196,6 +196,7 @@ export class SystemTextJsonCSharpRenderer extends CSharpRenderer { this.emitLine("#pragma warning restore CS8618"); this.emitLine("#pragma warning restore CS8601"); + this.emitLine("#pragma warning restore CS8602"); this.emitLine("#pragma warning restore CS8603"); } @@ -237,6 +238,9 @@ export class SystemTextJsonCSharpRenderer extends CSharpRenderer { this.emitLine("#nullable enable"); this.emitLine("#pragma warning disable CS8618"); this.emitLine("#pragma warning disable CS8601"); + // CS8602: the emitted constraint-check converters dereference + // Deserialize() results, which are nullable under NRT. + this.emitLine("#pragma warning disable CS8602"); this.emitLine("#pragma warning disable CS8603"); } diff --git a/packages/quicktype-core/src/language/CSharp/language.ts b/packages/quicktype-core/src/language/CSharp/language.ts index b7447d7329..5501853064 100644 --- a/packages/quicktype-core/src/language/CSharp/language.ts +++ b/packages/quicktype-core/src/language/CSharp/language.ts @@ -35,7 +35,7 @@ export const cSharpOptions = { NewtonSoft: "NewtonSoft", SystemTextJson: "SystemTextJson", } as const, - "NewtonSoft", + "SystemTextJson", ), useList: new EnumOption( "array-type", @@ -71,7 +71,7 @@ export const cSharpOptions = { "6": 6, "8": 8, } as const, - "6", + "8", "secondary", ), virtual: new BooleanOption("virtual", "Generate virtual properties", false), diff --git a/packages/quicktype-core/src/language/Dart/DartRenderer.ts b/packages/quicktype-core/src/language/Dart/DartRenderer.ts index f11f77f6f3..8a46bd7577 100644 --- a/packages/quicktype-core/src/language/Dart/DartRenderer.ts +++ b/packages/quicktype-core/src/language/Dart/DartRenderer.ts @@ -266,9 +266,7 @@ export class DartRenderer extends ConvenienceRenderer { ): Sourcelike { const nullable = forceNullable || - (this._options.nullSafety && - t.isNullable && - !this._options.requiredProperties); + (t.isNullable && !this._options.requiredProperties); const withNullable = (s: Sourcelike): Sourcelike => nullable ? [s, "?"] : s; return matchType( @@ -321,11 +319,7 @@ export class DartRenderer extends ConvenienceRenderer { list: Sourcelike, mapper: Sourcelike, ): Sourcelike { - if ( - this._options.nullSafety && - isNullable && - !this._options.requiredProperties - ) { + if (isNullable && !this._options.requiredProperties) { return [ list, " == null ? [] : ", @@ -356,11 +350,7 @@ export class DartRenderer extends ConvenienceRenderer { map: Sourcelike, valueMapper: Sourcelike, ): Sourcelike { - if ( - this._options.nullSafety && - isNullable && - !this._options.requiredProperties - ) { + if (isNullable && !this._options.requiredProperties) { return [ "Map.from(", map, @@ -388,11 +378,7 @@ export class DartRenderer extends ConvenienceRenderer { classType: ClassType, dynamic: Sourcelike, ): Sourcelike { - if ( - this._options.nullSafety && - isNullable && - !this._options.requiredProperties - ) { + if (isNullable && !this._options.requiredProperties) { return [ dynamic, " == null ? null : ", @@ -431,10 +417,7 @@ export class DartRenderer extends ConvenienceRenderer { (_nullType) => dynamic, // FIXME: check null (_boolType) => dynamic, (_integerType) => dynamic, - (_doubleType) => [ - dynamic, - this._options.nullSafety ? "?.toDouble()" : ".toDouble()", - ], + (_doubleType) => [dynamic, "?.toDouble()"], (_stringType) => dynamic, (arrayType) => this.mapList( @@ -469,8 +452,7 @@ export class DartRenderer extends ConvenienceRenderer { defined(this._enumValues.get(enumType)), ".map[", dynamic, - this._options.nullSafety && - (!isNullable || this._options.requiredProperties) + !isNullable || this._options.requiredProperties ? "]!" : "]", ]; @@ -493,8 +475,7 @@ export class DartRenderer extends ConvenienceRenderer { case "date": if ( (transformedStringType.isNullable || isNullable) && - !this._options.requiredProperties && - this._options.nullSafety + !this._options.requiredProperties ) { return [ dynamic, @@ -544,7 +525,6 @@ export class DartRenderer extends ConvenienceRenderer { ), (_classType) => { if ( - this._options.nullSafety && (_classType.isNullable || isNullable) && !this._options.requiredProperties ) { @@ -588,7 +568,6 @@ export class DartRenderer extends ConvenienceRenderer { switch (transformedStringType.kind) { case "date-time": if ( - this._options.nullSafety && !this._options.requiredProperties && (transformedStringType.isNullable || isNullable) ) { @@ -598,7 +577,6 @@ export class DartRenderer extends ConvenienceRenderer { return [dynamic, ".toIso8601String()"]; case "date": if ( - this._options.nullSafety && !this._options.requiredProperties && (transformedStringType.isNullable || isNullable) ) { @@ -642,8 +620,8 @@ export class DartRenderer extends ConvenienceRenderer { this.forEachClassProperty(c, "none", (name, _, prop) => { const required = this._options.requiredProperties || - (this._options.nullSafety && - (!prop.type.isNullable || !prop.isOptional)); + !prop.type.isNullable || + !prop.isOptional; this.emitLine(required ? "required " : "", "this.", name, ","); }); }); @@ -869,9 +847,8 @@ export class DartRenderer extends ConvenienceRenderer { const required = this._options.requiredProperties || - (this._options.nullSafety && - (!prop.type.isNullable || - !prop.isOptional)); + !prop.type.isNullable || + !prop.isOptional; if (this._options.useJsonAnnotation) { this.classPropertyCounter++; this.emitLine( diff --git a/packages/quicktype-core/src/language/Dart/language.ts b/packages/quicktype-core/src/language/Dart/language.ts index f32e85868e..167b061d71 100644 --- a/packages/quicktype-core/src/language/Dart/language.ts +++ b/packages/quicktype-core/src/language/Dart/language.ts @@ -15,7 +15,6 @@ import type { LanguageName, RendererOptions } from "../../types.js"; import { DartRenderer } from "./DartRenderer.js"; export const dartOptions = { - nullSafety: new BooleanOption("null-safety", "Null Safety", true), justTypes: new BooleanOption("just-types", "Types only", false), codersInClass: new BooleanOption( "coders-in-class", @@ -36,7 +35,7 @@ export const dartOptions = { finalProperties: new BooleanOption( "final-props", "Make all properties final", - false, + true, ), generateCopyWith: new BooleanOption( "copy-with", diff --git a/packages/quicktype-core/src/language/Haskell/language.ts b/packages/quicktype-core/src/language/Haskell/language.ts index 422adbd528..6d764ae766 100644 --- a/packages/quicktype-core/src/language/Haskell/language.ts +++ b/packages/quicktype-core/src/language/Haskell/language.ts @@ -19,7 +19,7 @@ export const haskellOptions = { array: false, list: true, } as const, - "array", + "list", ), moduleName: new StringOption( "module", diff --git a/packages/quicktype-core/src/language/Java/JavaJacksonRenderer.ts b/packages/quicktype-core/src/language/Java/JavaJacksonRenderer.ts index 673e44ad1f..15c24bebed 100644 --- a/packages/quicktype-core/src/language/Java/JavaJacksonRenderer.ts +++ b/packages/quicktype-core/src/language/Java/JavaJacksonRenderer.ts @@ -206,11 +206,16 @@ export class JacksonRenderer extends JavaRenderer { const { fieldName } = this.unionField(u, t); const rendered = this.javaTypeWithoutGenerics(true, t); if (this._options.useList && t instanceof ArrayType) { + // The TypeReference must carry the full generic type: + // a raw `TypeReference` would make Jackson accept + // any element type, so schema-invalid inputs (which the + // expected-failure fixtures rely on rejecting) would + // deserialize successfully. this.emitLine( "value.", fieldName, " = jsonParser.readValueAs(new TypeReference<", - rendered, + this.javaType(true, t), ">() {});", ); } else if ( diff --git a/packages/quicktype-core/src/language/Java/language.ts b/packages/quicktype-core/src/language/Java/language.ts index fac9e16b87..87d5166219 100644 --- a/packages/quicktype-core/src/language/Java/language.ts +++ b/packages/quicktype-core/src/language/Java/language.ts @@ -22,7 +22,7 @@ export const javaOptions = { "array-type", "Use T[] or List", { array: false, list: true } as const, - "array", + "list", ), justTypes: new BooleanOption("just-types", "Plain types only", false), dateTimeProvider: new EnumOption( diff --git a/packages/quicktype-core/src/language/Kotlin/language.ts b/packages/quicktype-core/src/language/Kotlin/language.ts index 28adca237c..528d00dd6b 100644 --- a/packages/quicktype-core/src/language/Kotlin/language.ts +++ b/packages/quicktype-core/src/language/Kotlin/language.ts @@ -33,7 +33,7 @@ export const kotlinOptions = { klaxon: "Klaxon", kotlinx: "KotlinX", } as const, - "klaxon", + "jackson", ), acronymStyle: acronymOption(AcronymStyleOptions.Pascal), packageName: new StringOption("package", "Package", "PACKAGE", "quicktype"), diff --git a/packages/quicktype-core/src/language/Rust/RustRenderer.ts b/packages/quicktype-core/src/language/Rust/RustRenderer.ts index c342f0141d..3024d97d5b 100644 --- a/packages/quicktype-core/src/language/Rust/RustRenderer.ts +++ b/packages/quicktype-core/src/language/Rust/RustRenderer.ts @@ -376,11 +376,7 @@ export class RustRenderer extends ConvenienceRenderer { } this.ensureBlankLine(); - if (this._options.edition2018) { - this.emitLine("use serde::{Serialize, Deserialize};"); - } else { - this.emitLine("extern crate serde_derive;"); - } + this.emitLine("use serde::{Serialize, Deserialize};"); if (this.haveMaps) { this.emitLine("use std::collections::HashMap;"); diff --git a/packages/quicktype-core/src/language/Rust/language.ts b/packages/quicktype-core/src/language/Rust/language.ts index 29030a4994..692980468a 100644 --- a/packages/quicktype-core/src/language/Rust/language.ts +++ b/packages/quicktype-core/src/language/Rust/language.ts @@ -28,10 +28,10 @@ export const rustOptions = { crate: Visibility.Crate, public: Visibility.Public, } as const, - "private", + "public", ), - deriveDebug: new BooleanOption("derive-debug", "Derive Debug impl", false), - deriveClone: new BooleanOption("derive-clone", "Derive Clone impl", false), + deriveDebug: new BooleanOption("derive-debug", "Derive Debug impl", true), + deriveClone: new BooleanOption("derive-clone", "Derive Clone impl", true), derivePartialEq: new BooleanOption( "derive-partial-eq", "Derive PartialEq impl", @@ -42,7 +42,6 @@ export const rustOptions = { "Skip serializing empty Option fields", false, ), - edition2018: new BooleanOption("edition-2018", "Edition 2018", true), leadingComments: new BooleanOption( "leading-comments", "Leading Comments", diff --git a/packages/quicktype-core/src/language/Swift/language.ts b/packages/quicktype-core/src/language/Swift/language.ts index 1e6a53b493..7e9fecf155 100644 --- a/packages/quicktype-core/src/language/Swift/language.ts +++ b/packages/quicktype-core/src/language/Swift/language.ts @@ -72,7 +72,7 @@ export const swiftOptions = { dense: true, normal: false, } as const, - "dense", + "normal", "secondary", ), linux: new BooleanOption( @@ -91,11 +91,6 @@ export const swiftOptions = { "If no matching case is found enum value is set to null", false, ), - swift5Support: new BooleanOption( - "swift-5-support", - "Renders output in a Swift 5 compatible mode", - false, - ), sendable: new BooleanOption( "sendable", "Mark generated models as Sendable", diff --git a/packages/quicktype-core/src/language/TypeScriptFlow/language.ts b/packages/quicktype-core/src/language/TypeScriptFlow/language.ts index a894ee2833..0c930a99e6 100644 --- a/packages/quicktype-core/src/language/TypeScriptFlow/language.ts +++ b/packages/quicktype-core/src/language/TypeScriptFlow/language.ts @@ -32,7 +32,7 @@ export const tsFlowOptions = { preferUnions: new BooleanOption( "prefer-unions", "Use union type instead of enum", - false, + true, ), preferTypes: new BooleanOption( "prefer-types", diff --git a/test/languages.ts b/test/languages.ts index 69b5fecb77..4dc7ab75aa 100644 --- a/test/languages.ts +++ b/test/languages.ts @@ -113,11 +113,15 @@ export const CSharpLanguage: Language = { skipSchema: [ "top-level-enum.schema", // The code we generate for top-level enums is incompatible with the driver ], - rendererOptions: { "check-required": "true" }, + // The default framework is SystemTextJson; this fixture deliberately + // pins NewtonSoft so the Newtonsoft renderer keeps end-to-end coverage. + rendererOptions: { "check-required": "true", framework: "NewtonSoft" }, quickTestRendererOptions: [ { "array-type": "list" }, + // The default is csharp-version=8; these keep the older + // language-version code paths covered. { "csharp-version": "5" }, - { "csharp-version": "8" }, + { "csharp-version": "6" }, { density: "dense" }, { "number-type": "decimal" }, { "any-type": "dynamic" }, @@ -157,15 +161,22 @@ export const CSharpLanguageSystemTextJson: Language = { // The following skips are pre-existing System.Text.Json renderer issues, // found when first enabling the schema fixture for this language: "keyword-unions.schema", // a property named "JsonSerializer" collides with System.Text.Json.JsonSerializer: CS0120 - "minmaxlength.schema", // generated converter triggers CS8602 warnings, which "dotnet run" prints to stdout, breaking the JSON comparison - "optional-constraints.schema", // same CS8602 stdout issue; also min/max on integers and pattern on optional strings aren't checked, so expected-failure samples don't fail - "optional-const-ref.schema", // same CS8602 stdout issue; also min/max on integers isn't checked, so the expected-failure sample doesn't fail + // minmaxlength.schema, optional-constraints.schema, and + // optional-const-ref.schema used to be skipped here because the + // generated converters triggered CS8602 warnings, which "dotnet + // run" prints to stdout, breaking the JSON comparison. The + // generated code now suppresses CS8602 alongside the other NRT + // pragmas, so they run. (Their .fail..json samples are + // not exercised because this fixture doesn't declare the minmax, + // minmaxlength, or pattern features.) ], rendererOptions: { "check-required": "true", framework: "SystemTextJson" }, quickTestRendererOptions: [ { "array-type": "list" }, + // The default is csharp-version=8; these keep the older + // language-version code paths covered. + { "csharp-version": "5" }, { "csharp-version": "6" }, - { "csharp-version": "8" }, { density: "dense" }, { "number-type": "decimal" }, { "any-type": "dynamic" }, @@ -196,7 +207,9 @@ export const JavaLanguage: Language = { skipMiscJSON: false, skipSchema: ["keyword-unions.schema"], // generates classes with names that are case-insensitively equal rendererOptions: {}, - quickTestRendererOptions: [{ "array-type": "list" }], + // The default is array-type=list; this keeps the T[] code path + // covered. + quickTestRendererOptions: [{ "array-type": "array" }], sourceFiles: ["src/language/Java/index.ts"], }; @@ -213,13 +226,13 @@ export const JavaLanguageWithLegacyDateTime: Language = { ], skipMiscJSON: true, // Handles edge cases differently and does not allow optional milliseconds. rendererOptions: { "datetime-provider": "legacy" }, - quickTestRendererOptions: [{ "array-type": "list" }], + quickTestRendererOptions: [{ "array-type": "array" }], }; export const JavaLanguageWithLombok: Language = { ...JavaLanguage, base: "test/fixtures/java-lombok", - quickTestRendererOptions: [{ "array-type": "list", lombok: "true" }], + quickTestRendererOptions: [{ "array-type": "array", lombok: "true" }], }; export const PythonLanguage: Language = { @@ -307,8 +320,13 @@ export const RustLanguage: Language = { quickTestRendererOptions: [ { density: "dense" }, { visibility: "crate" }, - { visibility: "private" }, - { visibility: "public" }, + // The pre-flip defaults: private fields without Debug/Clone + // derives, kept covered after the defaults changed. + { + visibility: "private", + "derive-debug": "false", + "derive-clone": "false", + }, ], sourceFiles: ["src/language/Rust/index.ts"], }; @@ -723,7 +741,14 @@ export const CPlusPlusLanguage: Language = { { "code-format": "with-struct" }, { wstring: "use-wstring" }, { "const-style": "east-const" }, - { boost: "false" }, + // The default is boost=false (C++17); this keeps the boost code + // path covered. Pinned to specific inputs because the default + // quicktest inputs (combinations[1-4].json) are all in this + // fixture's skipJSON, so plain-options quicktests never run for + // C++. unions.json exercises nulls inside unions, where the + // boost and std optional/variant code paths differ. + ["unions.json", { boost: "true" }], + ["pokedex.json", { boost: "true" }], ], sourceFiles: ["src/language/CPlusPlus/index.ts"], }; @@ -878,8 +903,9 @@ export const SwiftLanguage: Language = { "simple-object.json", { "struct-or-class": "class", "final-classes": "true" }, ], + // The default is density=normal; this keeps the dense code path + // covered. { density: "dense" }, - { density: "normal" }, { "access-level": "internal" }, { "access-level": "public" }, { protocol: "equatable" }, @@ -968,6 +994,9 @@ export const TypeScriptLanguage: Language = { { "acronym-style": "pascal" }, { converters: "all-objects" }, { readonly: "true" }, + // The default is prefer-unions=true; this keeps the TypeScript + // enum code path covered. + { "prefer-unions": "false" }, { "prefer-unknown": "false" }, ], sourceFiles: ["src/language/TypeScript/index.ts"], @@ -1048,6 +1077,10 @@ export const FlowLanguage: Language = { { "runtime-typecheck": "false" }, { "runtime-typecheck-ignore-unknown-properties": "true" }, { "nice-property-names": "true" }, + // Flow always renders enums as unions of string literals, so + // this only asserts that the flipped default stays a no-op for + // Flow output. + { "prefer-unions": "false" }, { "prefer-unknown": "false" }, ], sourceFiles: ["src/language/Flow/index.ts"], @@ -1305,7 +1338,9 @@ export const KotlinLanguage: Language = { "recursive-union-flattening.schema", ], skipMiscJSON: false, - rendererOptions: {}, + // The default framework is jackson; this fixture deliberately pins + // klaxon so the Klaxon renderer keeps end-to-end coverage. + rendererOptions: { framework: "klaxon" }, quickTestRendererOptions: [], sourceFiles: ["src/language/Kotlin/index.ts"], }; @@ -1591,7 +1626,9 @@ export const DartLanguage: Language = { ], skipMiscJSON: true, rendererOptions: {}, - quickTestRendererOptions: [], + // The default is final-props=true; this keeps the mutable-property + // code path covered. + quickTestRendererOptions: [{ "final-props": "false" }], sourceFiles: ["src/language/Dart/index.ts"], }; @@ -1735,7 +1772,9 @@ export const HaskellLanguage: Language = { "required-non-properties.schema", ], rendererOptions: {}, - quickTestRendererOptions: [{ "array-type": "list" }], + // The default is array-type=list; this keeps the Vector code path + // covered. + quickTestRendererOptions: [{ "array-type": "array" }], sourceFiles: ["src/language/Haskell/index.ts"], }; diff --git a/test/unit/just-types-option.test.ts b/test/unit/just-types-option.test.ts index 8ae56e317a..4d3e31766a 100644 --- a/test/unit/just-types-option.test.ts +++ b/test/unit/just-types-option.test.ts @@ -131,8 +131,8 @@ describe("framework defaults", () => { expect(output).toContain("io.circe"); }); - test("Kotlin defaults to Klaxon", async () => { + test("Kotlin defaults to Jackson", async () => { const output = await linesFor("kotlin"); - expect(output).toContain("com.beust.klaxon"); + expect(output).toContain("com.fasterxml.jackson"); }); });