terriajs
Version:
Geospatial data visualization platform.
80 lines (67 loc) • 3.17 kB
text/typescript
import { JsonObject } from "../../lib/Core/Json";
import {
AllowsUndefined,
Equals,
IsWritable,
IsWritableArray
} from "../../lib/Core/TypeConditionals";
import FlattenedFromTraits from "../../lib/Models/Definition/FlattenedFromTraits";
import TraitsForTesting from "./TraitsForTesting";
import { expectFalse, expectTrue } from "./TypeChecks";
type Flattened = FlattenedFromTraits<TraitsForTesting>;
const flattened: Flattened = {} as any;
// Simple properties allow undefined, whether they have a default or not.
expectTrue<Equals<typeof flattened.withDefault, number | undefined>>();
expectTrue<Equals<typeof flattened.withoutDefault, number | undefined>>();
expectTrue<Equals<typeof flattened.unknownObject, JsonObject | undefined>>();
expectTrue<
Equals<typeof flattened.unknownObjectWithDefault, JsonObject | undefined>
>();
expectTrue<Equals<typeof flattened.withNull, string | null | undefined>>();
// Properties may not be modified.
expectFalse<IsWritable<typeof flattened, "withDefault">>();
expectFalse<IsWritable<typeof flattened, "withoutDefault">>();
// Properties that are nested traits allow undefined.
expectTrue<AllowsUndefined<typeof flattened.nestedWithDefault>>();
expectTrue<AllowsUndefined<typeof flattened.nestedWithoutDefault>>();
const nested = flattened.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 _not_ be modified.
expectFalse<IsWritable<typeof nested, "withDefault">>();
expectFalse<IsWritable<typeof nested, "withoutDefault">>();
}
// Properties that are arrays of traits allow undefined.
expectTrue<AllowsUndefined<typeof flattened.nestedArrayWithDefault>>();
expectTrue<AllowsUndefined<typeof flattened.nestedArrayWithoutDefault>>();
// Array traits are _not_ writable.
expectFalse<
IsWritableArray<NonNullable<typeof flattened.nestedArrayWithDefault>>
>();
expectFalse<
IsWritableArray<NonNullable<typeof flattened.nestedArrayWithoutDefault>>
>();
const array = flattened.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 _not_ be modified.
expectFalse<IsWritable<typeof _first, "withDefault">>();
expectFalse<IsWritable<typeof _first, "withoutDefault">>();
}