model-explorer / js /tests /opsetChecker.test.js
mr4's picture
Upload 71 files
9bd422a verified
/**
* Unit tests for OpsetChecker.compute()
* Validates: Requirements 22.1, 22.2, 22.3, 22.4, 22.5
*/
import { describe, it, expect } from 'vitest';
const STANDARD_OPSETS = [7, 9, 11, 13, 15, 17, 18, 19, 20, 21];
/**
* Mirror the pure compute logic from OpsetChecker for testability.
*/
function computeOpsetData(parsedModel) {
const modelOpset = (parsedModel && parsedModel.metadata && parsedModel.metadata.opsetVersion) || 0;
const compatibility = STANDARD_OPSETS.map((version) => ({
version,
compatible: version >= modelOpset,
}));
const opsetImport = (parsedModel && parsedModel.metadata && Array.isArray(parsedModel.metadata.opsetImport))
? parsedModel.metadata.opsetImport
: [];
const domains = opsetImport.map((op) => ({
domain: op.domain || 'ai.onnx (default)',
version: op.version || 0,
}));
const nodes = (parsedModel && parsedModel.graph && parsedModel.graph.nodes) || [];
const customOperators = [];
const seen = new Set();
for (const node of nodes) {
if (node.domain && node.domain !== '' && node.domain !== 'ai.onnx') {
const key = `${node.domain}::${node.opType}`;
if (!seen.has(key)) {
seen.add(key);
customOperators.push({ name: node.opType || 'Unknown', domain: node.domain });
}
}
}
const allStandard = customOperators.length === 0;
return { modelOpset, compatibility, domains, customOperators, allStandard };
}
describe('OpsetChecker.compute', () => {
it('should return the model opset version (Req 22.1)', () => {
const model = {
metadata: { opsetVersion: 13 },
graph: { nodes: [] },
};
const result = computeOpsetData(model);
expect(result.modelOpset).toBe(13);
});
it('should mark standard versions >= model opset as compatible (Req 22.2)', () => {
const model = {
metadata: { opsetVersion: 13 },
graph: { nodes: [] },
};
const result = computeOpsetData(model);
for (const entry of result.compatibility) {
if (entry.version >= 13) {
expect(entry.compatible).toBe(true);
} else {
expect(entry.compatible).toBe(false);
}
}
});
it('should mark all versions compatible when model opset is very low', () => {
const model = {
metadata: { opsetVersion: 1 },
graph: { nodes: [] },
};
const result = computeOpsetData(model);
expect(result.compatibility.every((e) => e.compatible)).toBe(true);
});
it('should mark most versions incompatible when model opset is very high', () => {
const model = {
metadata: { opsetVersion: 21 },
graph: { nodes: [] },
};
const result = computeOpsetData(model);
const compatibleVersions = result.compatibility.filter((e) => e.compatible);
expect(compatibleVersions.length).toBe(1);
expect(compatibleVersions[0].version).toBe(21);
});
it('should display all domains from opset_import (Req 22.3)', () => {
const model = {
metadata: {
opsetVersion: 13,
opsetImport: [
{ domain: '', version: 13 },
{ domain: 'ai.onnx.ml', version: 2 },
],
},
graph: { nodes: [] },
};
const result = computeOpsetData(model);
expect(result.domains).toHaveLength(2);
expect(result.domains[0].domain).toBe('ai.onnx (default)');
expect(result.domains[0].version).toBe(13);
expect(result.domains[1].domain).toBe('ai.onnx.ml');
expect(result.domains[1].version).toBe(2);
});
it('should list custom domain operators (Req 22.4)', () => {
const model = {
metadata: { opsetVersion: 13 },
graph: {
nodes: [
{ opType: 'Conv', domain: '' },
{ opType: 'Relu', domain: '' },
{ opType: 'CustomOp', domain: 'com.mycompany' },
{ opType: 'AnotherOp', domain: 'com.mycompany' },
],
},
};
const result = computeOpsetData(model);
expect(result.allStandard).toBe(false);
expect(result.customOperators).toHaveLength(2);
expect(result.customOperators[0]).toEqual({ name: 'CustomOp', domain: 'com.mycompany' });
expect(result.customOperators[1]).toEqual({ name: 'AnotherOp', domain: 'com.mycompany' });
});
it('should deduplicate custom operators with same domain and opType', () => {
const model = {
metadata: { opsetVersion: 13 },
graph: {
nodes: [
{ opType: 'CustomOp', domain: 'com.mycompany' },
{ opType: 'CustomOp', domain: 'com.mycompany' },
{ opType: 'CustomOp', domain: 'com.mycompany' },
],
},
};
const result = computeOpsetData(model);
expect(result.customOperators).toHaveLength(1);
});
it('should report allStandard=true when all operators are from default domain (Req 22.5)', () => {
const model = {
metadata: { opsetVersion: 13 },
graph: {
nodes: [
{ opType: 'Conv', domain: '' },
{ opType: 'Relu', domain: '' },
{ opType: 'Add', domain: '' },
],
},
};
const result = computeOpsetData(model);
expect(result.allStandard).toBe(true);
expect(result.customOperators).toHaveLength(0);
});
it('should handle null/undefined model gracefully', () => {
const result = computeOpsetData(null);
expect(result.modelOpset).toBe(0);
expect(result.compatibility.length).toBe(STANDARD_OPSETS.length);
expect(result.domains).toHaveLength(0);
expect(result.customOperators).toHaveLength(0);
expect(result.allStandard).toBe(true);
});
it('should handle model with no opsetImport', () => {
const model = {
metadata: { opsetVersion: 11 },
graph: { nodes: [] },
};
const result = computeOpsetData(model);
expect(result.domains).toHaveLength(0);
});
it('should treat ai.onnx domain nodes as standard', () => {
const model = {
metadata: { opsetVersion: 13 },
graph: {
nodes: [
{ opType: 'Conv', domain: 'ai.onnx' },
{ opType: 'Relu', domain: '' },
],
},
};
const result = computeOpsetData(model);
expect(result.allStandard).toBe(true);
});
});