68 lines
2.0 KiB
TypeScript
68 lines
2.0 KiB
TypeScript
import { describe, it, expect } from 'vitest';
|
|
import { Ontology, validateEntity } from '../src/mind/ontology.js';
|
|
|
|
describe('Ontology Grounding', () => {
|
|
function makeOntology(): Ontology {
|
|
const ont = new Ontology();
|
|
ont.define('Person', {
|
|
required: ['name', 'email'],
|
|
optional: ['age', 'bio'],
|
|
});
|
|
ont.define('Project', {
|
|
required: ['title'],
|
|
optional: ['description', 'status'],
|
|
});
|
|
return ont;
|
|
}
|
|
|
|
it('valid entity passes validation', () => {
|
|
const ont = makeOntology();
|
|
const result = validateEntity(ont, {
|
|
type: 'Person',
|
|
properties: { name: 'Alice', email: 'alice@example.com', age: 30 },
|
|
});
|
|
expect(result.valid).toBe(true);
|
|
expect(result.issues).toHaveLength(0);
|
|
});
|
|
|
|
it('unknown type fails with issue', () => {
|
|
const ont = makeOntology();
|
|
const result = validateEntity(ont, {
|
|
type: 'Animal',
|
|
properties: { species: 'cat' },
|
|
});
|
|
expect(result.valid).toBe(false);
|
|
expect(result.issues).toContain('Unknown entity type: Animal');
|
|
});
|
|
|
|
it('unknown/unexpected properties get flagged', () => {
|
|
const ont = makeOntology();
|
|
const result = validateEntity(ont, {
|
|
type: 'Person',
|
|
properties: { name: 'Bob', email: 'bob@test.com', favoriteColor: 'blue' },
|
|
});
|
|
expect(result.valid).toBe(false);
|
|
expect(result.issues).toContain('Unknown property: favoriteColor');
|
|
});
|
|
|
|
it('missing required = invalid, missing optional = still valid', () => {
|
|
const ont = makeOntology();
|
|
|
|
// Missing required 'email'
|
|
const missing = validateEntity(ont, {
|
|
type: 'Person',
|
|
properties: { name: 'Charlie' },
|
|
});
|
|
expect(missing.valid).toBe(false);
|
|
expect(missing.issues).toContain('Missing required property: email');
|
|
|
|
// All required present, no optional — still valid
|
|
const minimal = validateEntity(ont, {
|
|
type: 'Project',
|
|
properties: { title: 'Waggle' },
|
|
});
|
|
expect(minimal.valid).toBe(true);
|
|
expect(minimal.issues).toHaveLength(0);
|
|
});
|
|
});
|