import type { ProtocolFixture } from "./types.js";

export const roundTripKnownBad: ProtocolFixture = {
  fixtureId: "protocol/round-trip-known-bad",
  protocolVersion: "1.0",
  scenarios: [
    {
      scenarioId: "unknown-field-dropped",
      kind: "serialization-round-trip",
      typedValue: { version: 1, name: "widget", legacyTag: "keep" },
      compatibilityContract: {
        allowUnknownFields: false,
        rejectVersionSkew: true,
        expectedVersion: 1,
        charset: "utf-8",
        newline: "lf",
        bom: "forbid",
        compression: "none",
      },
      observation: {
        serialized: '{"version":1,"name":"widget"}\n',
        deserialized: { version: 1, name: "widget" },
        metadata: {
          unknownFields: ["legacyTag"],
          inputVersion: 1,
          outputVersion: 1,
          hasBom: false,
          newlineStyle: "lf",
          compressed: false,
        },
      },
    },
    {
      scenarioId: "version-skew-accepted",
      kind: "serialization-round-trip",
      typedValue: { version: 2, name: "widget" },
      compatibilityContract: {
        rejectVersionSkew: true,
        expectedVersion: 1,
        allowUnknownFields: true,
      },
      observation: {
        serialized: '{"version":2,"name":"widget"}\n',
        deserialized: { version: 2, name: "widget" },
        metadata: {
          inputVersion: 2,
          outputVersion: 2,
        },
      },
    },
    {
      scenarioId: "bom-without-contract",
      kind: "serialization-round-trip",
      typedValue: { version: 1, name: "widget" },
      compatibilityContract: {
        bom: "forbid",
        charset: "utf-8",
      },
      observation: {
        serialized: '\ufeff{"version":1,"name":"widget"}\n',
        deserialized: { version: 1, name: "widget" },
        metadata: {
          hasBom: true,
        },
      },
    },
    {
      scenarioId: "newline-skew",
      kind: "serialization-round-trip",
      typedValue: { version: 1, name: "widget" },
      compatibilityContract: {
        newline: "lf",
      },
      observation: {
        serialized: '{"version":1,"name":"widget"}\r\n',
        deserialized: { version: 1, name: "widget" },
        metadata: {
          newlineStyle: "crlf",
        },
      },
    },
    {
      scenarioId: "partial-write-truncation",
      kind: "serialization-round-trip",
      typedValue: { version: 1, name: "widget", count: 9 },
      compatibilityContract: {
        rejectPartialWrites: true,
      },
      observation: {
        serialized: '{"version":1,"name":"widget","count":',
        deserialized: { version: 1, name: "widget" },
        metadata: {
          partialWrite: true,
        },
      },
    },
  ],
};
