terriajs
Version:
Geospatial data visualization platform.
90 lines (76 loc) • 3.66 kB
text/typescript
import StratumFromTraits from "../../lib/Models/Definition/StratumFromTraits";
import TraitsForTesting from "./TraitsForTesting";
import { expectFalse, expectTrue } from "./TypeChecks";
import {
Equals,
IsWritable,
AllowsUndefined,
IsWritableArray
} from "../../lib/Core/TypeConditionals";
import { JsonObject } from "../../lib/Core/Json";
type Stratum = StratumFromTraits<TraitsForTesting>;
const stratum: Stratum = {} as any;
// Simple properties allow undefined, whether they have a default or not.
expectTrue<Equals<typeof stratum.withDefault, number | undefined>>();
expectTrue<Equals<typeof stratum.withoutDefault, number | undefined>>();
expectTrue<Equals<typeof stratum.unknownObject, JsonObject | undefined>>();
expectTrue<
Equals<typeof stratum.unknownObjectWithDefault, JsonObject | undefined>
>();
expectTrue<Equals<typeof stratum.withNull, string | null | undefined>>();
// All properties can be modified.
expectTrue<IsWritable<typeof stratum, "withDefault">>();
expectTrue<IsWritable<typeof stratum, "withoutDefault">>();
expectTrue<IsWritable<typeof stratum, "unknownObject">>();
expectTrue<IsWritable<typeof stratum, "unknownObjectWithDefault">>();
expectTrue<IsWritable<typeof stratum, "withNull">>();
// Properties that are nested traits allow undefined.
expectTrue<AllowsUndefined<typeof stratum.nestedWithDefault>>();
expectTrue<AllowsUndefined<typeof stratum.nestedWithoutDefault>>();
const nested = stratum.nestedWithDefault;
if (nested) {
// All nested properties allow undefined.
expectTrue<Equals<typeof nested.withDefault, number | undefined>>();
expectTrue<Equals<typeof nested.withoutDefault, number | undefined>>();
expectTrue<Equals<typeof nested.unknownObject, JsonObject | undefined>>();
expectTrue<
Equals<typeof nested.unknownObjectWithDefault, JsonObject | undefined>
>();
expectTrue<Equals<typeof nested.withNull, string | null | undefined>>();
// All nested properties can be modified.
expectTrue<IsWritable<typeof nested, "withDefault">>();
expectTrue<IsWritable<typeof nested, "withoutDefault">>();
expectTrue<IsWritable<typeof nested, "unknownObject">>();
expectTrue<IsWritable<typeof nested, "unknownObjectWithDefault">>();
expectTrue<IsWritable<typeof nested, "withNull">>();
}
// Properties that are arrays of traits allow undefined.
expectTrue<AllowsUndefined<typeof stratum.nestedArrayWithDefault>>();
expectTrue<AllowsUndefined<typeof stratum.nestedArrayWithoutDefault>>();
// Array traits are writable.
expectTrue<
IsWritableArray<NonNullable<typeof stratum.nestedArrayWithDefault>>
>();
expectTrue<
IsWritableArray<NonNullable<typeof stratum.nestedArrayWithoutDefault>>
>();
const array = stratum.nestedArrayWithDefault;
if (array) {
const _first = array[0];
// Arrays may not _contain_ undefineds.
expectFalse<AllowsUndefined<typeof _first>>();
// Properties in traits in arrays allow undefined.
expectTrue<Equals<typeof _first.withDefault, number | undefined>>();
expectTrue<Equals<typeof _first.withoutDefault, number | undefined>>();
expectTrue<Equals<typeof _first.unknownObject, JsonObject | undefined>>();
expectTrue<
Equals<typeof _first.unknownObjectWithDefault, JsonObject | undefined>
>();
expectTrue<Equals<typeof _first.withNull, string | null | undefined>>();
// Properties in traits in arrays can be modified.
expectTrue<IsWritable<typeof _first, "withDefault">>();
expectTrue<IsWritable<typeof _first, "withoutDefault">>();
expectTrue<IsWritable<typeof _first, "unknownObject">>();
expectTrue<IsWritable<typeof _first, "unknownObjectWithDefault">>();
expectTrue<IsWritable<typeof _first, "withNull">>();
}