summaryrefslogtreecommitdiffstats
path: root/dom/webgpu/tests/cts/checkout/src/common/runtime/helper/options.ts
diff options
context:
space:
mode:
Diffstat (limited to 'dom/webgpu/tests/cts/checkout/src/common/runtime/helper/options.ts')
-rw-r--r--dom/webgpu/tests/cts/checkout/src/common/runtime/helper/options.ts129
1 files changed, 129 insertions, 0 deletions
diff --git a/dom/webgpu/tests/cts/checkout/src/common/runtime/helper/options.ts b/dom/webgpu/tests/cts/checkout/src/common/runtime/helper/options.ts
new file mode 100644
index 0000000000..38974b803f
--- /dev/null
+++ b/dom/webgpu/tests/cts/checkout/src/common/runtime/helper/options.ts
@@ -0,0 +1,129 @@
+let windowURL: URL | undefined = undefined;
+function getWindowURL() {
+ if (windowURL === undefined) {
+ windowURL = new URL(window.location.toString());
+ }
+ return windowURL;
+}
+
+export function optionEnabled(
+ opt: string,
+ searchParams: URLSearchParams = getWindowURL().searchParams
+): boolean {
+ const val = searchParams.get(opt);
+ return val !== null && val !== '0';
+}
+
+export function optionString(
+ opt: string,
+ searchParams: URLSearchParams = getWindowURL().searchParams
+): string {
+ return searchParams.get(opt) || '';
+}
+
+/**
+ * The possible options for the tests.
+ */
+export interface CTSOptions {
+ worker: boolean;
+ debug: boolean;
+ compatibility: boolean;
+ unrollConstEvalLoops: boolean;
+ powerPreference?: GPUPowerPreference | '';
+}
+
+export const kDefaultCTSOptions: CTSOptions = {
+ worker: false,
+ debug: true,
+ compatibility: false,
+ unrollConstEvalLoops: false,
+ powerPreference: '',
+};
+
+/**
+ * Extra per option info.
+ */
+export interface OptionInfo {
+ description: string;
+ parser?: (key: string, searchParams?: URLSearchParams) => boolean | string;
+ selectValueDescriptions?: { value: string; description: string }[];
+}
+
+/**
+ * Type for info for every option. This definition means adding an option
+ * will generate a compile time error if no extra info is provided.
+ */
+export type OptionsInfos<Type> = Record<keyof Type, OptionInfo>;
+
+/**
+ * Options to the CTS.
+ */
+export const kCTSOptionsInfo: OptionsInfos<CTSOptions> = {
+ worker: { description: 'run in a worker' },
+ debug: { description: 'show more info' },
+ compatibility: { description: 'run in compatibility mode' },
+ unrollConstEvalLoops: { description: 'unroll const eval loops in WGSL' },
+ powerPreference: {
+ description: 'set default powerPreference for some tests',
+ parser: optionString,
+ selectValueDescriptions: [
+ { value: '', description: 'default' },
+ { value: 'low-power', description: 'low-power' },
+ { value: 'high-performance', description: 'high-performance' },
+ ],
+ },
+};
+
+/**
+ * Converts camel case to snake case.
+ * Examples:
+ * fooBar -> foo_bar
+ * parseHTMLFile -> parse_html_file
+ */
+export function camelCaseToSnakeCase(id: string) {
+ return id
+ .replace(/(.)([A-Z][a-z]+)/g, '$1_$2')
+ .replace(/([a-z0-9])([A-Z])/g, '$1_$2')
+ .toLowerCase();
+}
+
+/**
+ * Creates a Options from search parameters.
+ */
+function getOptionsInfoFromSearchString<Type extends CTSOptions>(
+ optionsInfos: OptionsInfos<Type>,
+ searchString: string
+): Type {
+ const searchParams = new URLSearchParams(searchString);
+ const optionValues: Record<string, boolean | string> = {};
+ for (const [optionName, info] of Object.entries(optionsInfos)) {
+ const parser = info.parser || optionEnabled;
+ optionValues[optionName] = parser(camelCaseToSnakeCase(optionName), searchParams);
+ }
+ return optionValues as unknown as Type;
+}
+
+/**
+ * Given a test query string in the form of `suite:foo,bar,moo&opt1=val1&opt2=val2
+ * returns the query and the options.
+ */
+export function parseSearchParamLikeWithOptions<Type extends CTSOptions>(
+ optionsInfos: OptionsInfos<Type>,
+ query: string
+): {
+ queries: string[];
+ options: Type;
+} {
+ const searchString = query.includes('q=') || query.startsWith('?') ? query : `q=${query}`;
+ const queries = new URLSearchParams(searchString).getAll('q');
+ const options = getOptionsInfoFromSearchString(optionsInfos, searchString);
+ return { queries, options };
+}
+
+/**
+ * Given a test query string in the form of `suite:foo,bar,moo&opt1=val1&opt2=val2
+ * returns the query and the common options.
+ */
+export function parseSearchParamLikeWithCTSOptions(query: string) {
+ return parseSearchParamLikeWithOptions(kCTSOptionsInfo, query);
+}