Skip to content

Commit 05363a0

Browse files
committed
test: Verify the NiftiPEDir check
1 parent a0de153 commit 05363a0

File tree

2 files changed

+104
-6
lines changed

2 files changed

+104
-6
lines changed

src/schema/applyRules.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -143,7 +143,7 @@ function mapEvalCheck(statements: string[], context: BIDSContext): boolean {
143143
* Classic rules interpreted like selectors. Examples in specification:
144144
* schema/rules/checks/*
145145
*/
146-
function evalRuleChecks(
146+
export function evalRuleChecks(
147147
rule: GenericRule,
148148
context: BIDSContext,
149149
schema: GenericSchema,
Lines changed: 103 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,111 @@
11
import { assertEquals, assertObjectMatch } from '@std/assert'
2+
import type { BIDSFile, FileTree } from '../../types/filetree.ts'
3+
import type { GenericSchema, GenericRule } from '../../types/schema.ts'
24
import { loadHeader } from '../../files/nifti.ts'
35
import { BIDSFileDeno } from '../../files/deno.ts'
6+
import { BIDSContextDataset, BIDSContext } from '../../schema/context.ts'
7+
import { loadSchema } from '../../setup/loadSchema.ts'
8+
import { evalRuleChecks } from '../../schema/applyRules.ts'
9+
// import { applyRules } from '../../schema/applyRules.ts'
10+
import type { Context, NiftiHeader } from '@bids/schema/context'
11+
import type { Schema } from '@bids/schema/metaschema'
12+
13+
import { expressionFunctions } from '../../schema/expressionLanguage.ts'
14+
15+
function prepContext(header: NiftiHeader, dir: string, pedir: string): BIDSContext {
16+
const fullContext = {
17+
dataset: new BIDSContextDataset({}),
18+
nifti_header: header,
19+
entities: {direction: dir},
20+
sidecar: {PhaseEncodingDirection: pedir},
21+
} as unknown as BIDSContext
22+
Object.assign(fullContext, expressionFunctions)
23+
return fullContext
24+
}
425

526
Deno.test('Test NIFTI-specific rules', async (t) => {
27+
const RAS = await loadHeader(new BIDSFileDeno('', 'tests/data/RAS.nii.gz'))
28+
const SPL = await loadHeader(new BIDSFileDeno('', 'tests/data/SPL.nii.gz'))
29+
const AIR = await loadHeader(new BIDSFileDeno('', 'tests/data/AIR.nii.gz'))
30+
31+
const schema = await loadSchema() as Schema
32+
const NiftiPEDir = schema.rules?.checks?.nifti?.NiftiPEDir as GenericRule
33+
634
await t.step('Test reading NIfTI axis codes' , async () => {
7-
for (const axcodes of [['R', 'A', 'S'], ['S', 'P', 'L'], ['A', 'I', 'R']]) {
8-
const testfile = `tests/data/${axcodes.join('')}.nii.gz`
9-
const header = await loadHeader(new BIDSFileDeno('', testfile))
10-
assertEquals(header.axis_codes, axcodes)
11-
}
35+
assertEquals(RAS.axis_codes, ['R', 'A', 'S'])
36+
assertEquals(SPL.axis_codes, ['S', 'P', 'L'])
37+
assertEquals(AIR.axis_codes, ['A', 'I', 'R'])
38+
})
39+
40+
await t.step('Test rules.checks.nifti.NiftiPEDir' , async () => {
41+
const schemaPath = 'rules.checks.nifti.NiftiPEDir'
42+
43+
let context = prepContext(RAS, 'PA', 'j')
44+
evalRuleChecks(NiftiPEDir, context, {} as GenericSchema, schemaPath)
45+
assertEquals(context.dataset.issues.get({}).length, 0)
46+
context = prepContext(RAS, 'AP', 'j-')
47+
evalRuleChecks(NiftiPEDir, context, {} as GenericSchema, schemaPath)
48+
assertEquals(context.dataset.issues.get({}).length, 0)
49+
context = prepContext(RAS, 'LR', 'i')
50+
evalRuleChecks(NiftiPEDir, context, {} as GenericSchema, schemaPath)
51+
assertEquals(context.dataset.issues.get({}).length, 0)
52+
context = prepContext(RAS, 'RL', 'i-')
53+
evalRuleChecks(NiftiPEDir, context, {} as GenericSchema, schemaPath)
54+
assertEquals(context.dataset.issues.get({}).length, 0)
55+
context = prepContext(RAS, 'IS', 'k')
56+
evalRuleChecks(NiftiPEDir, context, {} as GenericSchema, schemaPath)
57+
assertEquals(context.dataset.issues.get({}).length, 0)
58+
context = prepContext(RAS, 'SI', 'k-')
59+
evalRuleChecks(NiftiPEDir, context, {} as GenericSchema, schemaPath)
60+
assertEquals(context.dataset.issues.get({}).length, 0)
61+
62+
// Common flips
63+
context = prepContext(RAS, 'AP', 'j')
64+
evalRuleChecks(NiftiPEDir, context, {} as GenericSchema, schemaPath)
65+
assertEquals(context.dataset.issues.get({code: 'NIFTI_PE_DIRECTION_CONSISTENCY' }).length, 1)
66+
context = prepContext(RAS, 'PA', 'j-')
67+
evalRuleChecks(NiftiPEDir, context, {} as GenericSchema, schemaPath)
68+
assertEquals(context.dataset.issues.get({code: 'NIFTI_PE_DIRECTION_CONSISTENCY' }).length, 1)
69+
context = prepContext(RAS, 'RL', 'i')
70+
evalRuleChecks(NiftiPEDir, context, {} as GenericSchema, schemaPath)
71+
assertEquals(context.dataset.issues.get({code: 'NIFTI_PE_DIRECTION_CONSISTENCY' }).length, 1)
72+
context = prepContext(RAS, 'LR', 'i-')
73+
evalRuleChecks(NiftiPEDir, context, {} as GenericSchema, schemaPath)
74+
assertEquals(context.dataset.issues.get({code: 'NIFTI_PE_DIRECTION_CONSISTENCY' }).length, 1)
75+
76+
// Wrong axes
77+
context = prepContext(RAS, 'PA', 'i')
78+
evalRuleChecks(NiftiPEDir, context, {} as GenericSchema, schemaPath)
79+
assertEquals(context.dataset.issues.get({code: 'NIFTI_PE_DIRECTION_CONSISTENCY' }).length, 1)
80+
context = prepContext(RAS, 'AP', 'k')
81+
evalRuleChecks(NiftiPEDir, context, {} as GenericSchema, schemaPath)
82+
assertEquals(context.dataset.issues.get({code: 'NIFTI_PE_DIRECTION_CONSISTENCY' }).length, 1)
83+
context = prepContext(RAS, 'LR', 'j')
84+
evalRuleChecks(NiftiPEDir, context, {} as GenericSchema, schemaPath)
85+
assertEquals(context.dataset.issues.get({code: 'NIFTI_PE_DIRECTION_CONSISTENCY' }).length, 1)
86+
context = prepContext(RAS, 'RL', 'k-')
87+
evalRuleChecks(NiftiPEDir, context, {} as GenericSchema, schemaPath)
88+
assertEquals(context.dataset.issues.get({code: 'NIFTI_PE_DIRECTION_CONSISTENCY' }).length, 1)
89+
90+
// A couple checks on SPL and AIR
91+
context = prepContext(SPL, 'IS', 'i')
92+
evalRuleChecks(NiftiPEDir, context, {} as GenericSchema, schemaPath)
93+
assertEquals(context.dataset.issues.get({}).length, 0)
94+
context = prepContext(SPL, 'AP', 'j')
95+
evalRuleChecks(NiftiPEDir, context, {} as GenericSchema, schemaPath)
96+
assertEquals(context.dataset.issues.get({}).length, 0)
97+
context = prepContext(SPL, 'RL', 'k')
98+
evalRuleChecks(NiftiPEDir, context, {} as GenericSchema, schemaPath)
99+
assertEquals(context.dataset.issues.get({}).length, 0)
100+
101+
context = prepContext(AIR, 'IS', 'j-')
102+
evalRuleChecks(NiftiPEDir, context, {} as GenericSchema, schemaPath)
103+
assertEquals(context.dataset.issues.get({}).length, 0)
104+
context = prepContext(AIR, 'AP', 'i-')
105+
evalRuleChecks(NiftiPEDir, context, {} as GenericSchema, schemaPath)
106+
assertEquals(context.dataset.issues.get({}).length, 0)
107+
context = prepContext(AIR, 'RL', 'k-')
108+
evalRuleChecks(NiftiPEDir, context, {} as GenericSchema, schemaPath)
109+
assertEquals(context.dataset.issues.get({}).length, 0)
12110
})
13111
})

0 commit comments

Comments
 (0)