Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 2 additions & 2 deletions packages/quicktype-core/src/language/Dart/DartRenderer.ts
Original file line number Diff line number Diff line change
Expand Up @@ -117,12 +117,12 @@ export class DartRenderer extends ConvenienceRenderer {
const encoder = new DependencyName(
propertyNamingFunction,
name.order,
(lookup) => `${lookup(name)}_${this.toJson}`,
(lookup) => `${lookup(name)}_toJson`,
);
const decoder = new DependencyName(
propertyNamingFunction,
name.order,
(lookup) => `${lookup(name)}_${this.fromJson}`,
(lookup) => `${lookup(name)}_fromJson`,
);
this._topLevelDependents.set(name, { encoder, decoder });
return [encoder, decoder];
Expand Down
8 changes: 6 additions & 2 deletions test/languages.ts
Original file line number Diff line number Diff line change
Expand Up @@ -1628,8 +1628,12 @@ export const DartLanguage: Language = {
skipMiscJSON: true,
rendererOptions: {},
// The default is final-props=true; this keeps the mutable-property
// code path covered.
quickTestRendererOptions: [{ "final-props": "false" }],
// code path covered. The targeted from-map sample also verifies that
// the fixture driver can keep calling the top-level JSON string helpers.
quickTestRendererOptions: [
{ "final-props": "false" },
["simple-object.json", { "from-map": "true" }],
],
sourceFiles: ["src/language/Dart/index.ts"],
};

Expand Down
68 changes: 68 additions & 0 deletions test/unit/dart-method-names.test.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,68 @@
import { describe, expect, test } from "vitest";

import {
InputData,
type RendererOptions,
jsonInputForTargetLanguage,
quicktype,
} from "../../packages/quicktype-core/src/index.js";

async function renderDart(
rendererOptions: RendererOptions = {},
): Promise<string[]> {
const jsonInput = jsonInputForTargetLanguage("dart");
await jsonInput.addSource({
name: "Sensordata",
samples: ['{"sensor":"temp","data":[1,2,3]}'],
});

const inputData = new InputData();
inputData.addInput(jsonInput);

const result = await quicktype({
inputData,
lang: "dart",
rendererOptions,
});
return result.lines;
}

describe("Dart JSON method names", () => {
test("from-map only renames class-level map methods", async () => {
const lines = await renderDart({ "from-map": "true" });

expect(lines).toContain(
"Sensordata sensordataFromJson(String str) => Sensordata.fromMap(json.decode(str));",
);
expect(lines).toContain(
"String sensordataToJson(Sensordata data) => json.encode(data.toMap());",
);
expect(lines).toContain(
" factory Sensordata.fromMap(Map<String, dynamic> json) => Sensordata(",
);
expect(lines).toContain(" Map<String, dynamic> toMap() => {");
expect(lines.some((line) => line.includes("sensordataFromMap"))).toBe(
false,
);
expect(lines.some((line) => line.includes("sensordataToMap"))).toBe(
false,
);
});

test("uses Json names at both levels by default", async () => {
const lines = await renderDart();

expect(lines).toContain(
"Sensordata sensordataFromJson(String str) => Sensordata.fromJson(json.decode(str));",
);
expect(lines).toContain(
"String sensordataToJson(Sensordata data) => json.encode(data.toJson());",
);
expect(lines).toContain(
" factory Sensordata.fromJson(Map<String, dynamic> json) => Sensordata(",
);
expect(lines).toContain(" Map<String, dynamic> toJson() => {");
expect(lines.some((line) => line.includes("fromMap"))).toBe(false);
expect(lines.some((line) => line.includes("toMap"))).toBe(false);
});
});
Loading