distark-render 1.0.6 → 1.0.7

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (94) hide show
  1. package/README.md +158 -154
  2. package/dist/cli/animate.d.ts +8 -0
  3. package/dist/cli/animate.d.ts.map +1 -0
  4. package/dist/cli/animate.js +121 -0
  5. package/dist/cli/animate.js.map +1 -0
  6. package/dist/cli/diff.d.ts +8 -0
  7. package/dist/cli/diff.d.ts.map +1 -0
  8. package/dist/cli/diff.js +124 -0
  9. package/dist/cli/diff.js.map +1 -0
  10. package/dist/cli/distark-check.d.ts +13 -0
  11. package/dist/cli/distark-check.d.ts.map +1 -0
  12. package/dist/cli/distark-check.js +69 -0
  13. package/dist/cli/distark-check.js.map +1 -0
  14. package/dist/cli/query.d.ts +12 -0
  15. package/dist/cli/query.d.ts.map +1 -0
  16. package/dist/cli/query.js +64 -0
  17. package/dist/cli/query.js.map +1 -0
  18. package/dist/cli/record.d.ts +13 -0
  19. package/dist/cli/record.d.ts.map +1 -0
  20. package/dist/cli/record.js +97 -0
  21. package/dist/cli/record.js.map +1 -0
  22. package/dist/cli/render.d.ts +40 -0
  23. package/dist/cli/render.d.ts.map +1 -0
  24. package/dist/cli/render.js +75 -0
  25. package/dist/cli/render.js.map +1 -0
  26. package/dist/cli/shared.d.ts +6 -0
  27. package/dist/cli/shared.d.ts.map +1 -0
  28. package/dist/cli/shared.js +54 -0
  29. package/dist/cli/shared.js.map +1 -0
  30. package/dist/cli/test.d.ts +13 -0
  31. package/dist/cli/test.d.ts.map +1 -0
  32. package/dist/cli/test.js +130 -0
  33. package/dist/cli/test.js.map +1 -0
  34. package/dist/cli/verify.d.ts +21 -0
  35. package/dist/cli/verify.d.ts.map +1 -0
  36. package/dist/cli/verify.js +175 -0
  37. package/dist/cli/verify.js.map +1 -0
  38. package/dist/modules/adapters/p5Renderer.d.ts +0 -0
  39. package/dist/modules/adapters/p5Renderer.d.ts.map +0 -0
  40. package/dist/modules/adapters/p5Renderer.js +0 -0
  41. package/dist/modules/adapters/p5Renderer.js.map +0 -0
  42. package/dist/modules/adapters/skiaRenderer.d.ts +0 -0
  43. package/dist/modules/adapters/skiaRenderer.d.ts.map +0 -0
  44. package/dist/modules/adapters/skiaRenderer.js +0 -0
  45. package/dist/modules/adapters/skiaRenderer.js.map +0 -0
  46. package/dist/modules/animationDiff.d.ts +0 -0
  47. package/dist/modules/animationDiff.d.ts.map +0 -0
  48. package/dist/modules/animationDiff.js +0 -0
  49. package/dist/modules/animationDiff.js.map +0 -0
  50. package/dist/modules/eyeSystem.d.ts +0 -0
  51. package/dist/modules/eyeSystem.d.ts.map +0 -0
  52. package/dist/modules/eyeSystem.js +0 -0
  53. package/dist/modules/eyeSystem.js.map +0 -0
  54. package/dist/modules/imageLoad.d.ts +0 -0
  55. package/dist/modules/imageLoad.d.ts.map +0 -0
  56. package/dist/modules/imageLoad.js +0 -0
  57. package/dist/modules/imageLoad.js.map +0 -0
  58. package/dist/modules/mouthSystem.d.ts +0 -0
  59. package/dist/modules/mouthSystem.d.ts.map +0 -0
  60. package/dist/modules/mouthSystem.js +0 -0
  61. package/dist/modules/mouthSystem.js.map +0 -0
  62. package/dist/modules/renderRig.d.ts +0 -0
  63. package/dist/modules/renderRig.d.ts.map +0 -0
  64. package/dist/modules/renderRig.js +0 -0
  65. package/dist/modules/renderRig.js.map +0 -0
  66. package/dist/tests/test-animation-diff-rendering.d.ts +7 -0
  67. package/dist/tests/test-animation-diff-rendering.d.ts.map +1 -0
  68. package/dist/tests/test-animation-diff-rendering.js +444 -0
  69. package/dist/tests/test-animation-diff-rendering.js.map +1 -0
  70. package/dist/tests/test-animation-diff.d.ts +7 -0
  71. package/dist/tests/test-animation-diff.d.ts.map +1 -0
  72. package/dist/tests/test-animation-diff.js +488 -0
  73. package/dist/tests/test-animation-diff.js.map +1 -0
  74. package/dist/tests/test-cli.d.ts +8 -0
  75. package/dist/tests/test-cli.d.ts.map +1 -0
  76. package/dist/tests/test-cli.js +307 -0
  77. package/dist/tests/test-cli.js.map +1 -0
  78. package/dist/tests/test-joint-movement.d.ts +0 -0
  79. package/dist/tests/test-joint-movement.d.ts.map +0 -0
  80. package/dist/tests/test-joint-movement.js +0 -0
  81. package/dist/tests/test-joint-movement.js.map +0 -0
  82. package/dist/tests/test-skia.d.ts +0 -0
  83. package/dist/tests/test-skia.d.ts.map +0 -0
  84. package/dist/tests/test-skia.js +0 -0
  85. package/dist/tests/test-skia.js.map +0 -0
  86. package/dist/tests/test-visual-verification.d.ts +0 -0
  87. package/dist/tests/test-visual-verification.d.ts.map +0 -0
  88. package/dist/tests/test-visual-verification.js +0 -0
  89. package/dist/tests/test-visual-verification.js.map +0 -0
  90. package/dist/types.d.ts +0 -0
  91. package/dist/types.d.ts.map +0 -0
  92. package/dist/types.js +0 -0
  93. package/dist/types.js.map +0 -0
  94. package/package.json +9 -2
@@ -0,0 +1,307 @@
1
+ /**
2
+ * Tests for distark-check CLI commands
3
+ *
4
+ * Tests render, verify, animate, and diff commands using the tank.json fixture.
5
+ * Query is tested structurally (no API key required for test).
6
+ */
7
+ import { readFile, mkdir, rm, access } from 'fs/promises';
8
+ import { execSync } from 'child_process';
9
+ import { join } from 'path';
10
+ const CLI = 'node dist/cli/distark-check.js';
11
+ const TANK = 'assets/tank.json';
12
+ const TEST_DIR = 'test-outputs/cli';
13
+ function run(cmd) {
14
+ try {
15
+ const stdout = execSync(cmd, { encoding: 'utf-8', timeout: 60000, stdio: ['pipe', 'pipe', 'pipe'] });
16
+ return { stdout, stderr: '', exitCode: 0 };
17
+ }
18
+ catch (err) {
19
+ return {
20
+ stdout: err.stdout || '',
21
+ stderr: err.stderr || '',
22
+ exitCode: err.status || 1,
23
+ };
24
+ }
25
+ }
26
+ async function fileExists(path) {
27
+ try {
28
+ await access(path);
29
+ return true;
30
+ }
31
+ catch {
32
+ return false;
33
+ }
34
+ }
35
+ // ─── RENDER TESTS ───
36
+ async function testRenderBasic() {
37
+ const out = join(TEST_DIR, 'render-basic.png');
38
+ const result = run(`${CLI} render ${TANK} -o ${out}`);
39
+ if (result.exitCode !== 0) {
40
+ return { name: 'render: basic', passed: false, detail: `Exit code ${result.exitCode}: ${result.stderr}` };
41
+ }
42
+ const exists = await fileExists(out);
43
+ if (!exists) {
44
+ return { name: 'render: basic', passed: false, detail: 'Output PNG not created' };
45
+ }
46
+ // Check stdout contains valid JSON report
47
+ try {
48
+ const report = JSON.parse(result.stdout);
49
+ if (!report.dimensions || !report.characters) {
50
+ return { name: 'render: basic', passed: false, detail: 'Report missing fields' };
51
+ }
52
+ if (report.characters.length === 0) {
53
+ return { name: 'render: basic', passed: false, detail: 'No characters in report' };
54
+ }
55
+ return { name: 'render: basic', passed: true };
56
+ }
57
+ catch {
58
+ return { name: 'render: basic', passed: false, detail: 'stdout is not valid JSON' };
59
+ }
60
+ }
61
+ async function testRenderWithReport() {
62
+ const out = join(TEST_DIR, 'render-report.png');
63
+ const result = run(`${CLI} render ${TANK} -o ${out} --report`);
64
+ if (result.exitCode !== 0) {
65
+ return { name: 'render: --report flag', passed: false, detail: result.stderr };
66
+ }
67
+ const reportFile = out.replace('.png', '.report.json');
68
+ const exists = await fileExists(reportFile);
69
+ if (!exists) {
70
+ return { name: 'render: --report flag', passed: false, detail: 'Report file not created' };
71
+ }
72
+ const reportContent = JSON.parse(await readFile(reportFile, 'utf-8'));
73
+ if (!reportContent.visible_parts || !reportContent.pivot_points) {
74
+ return { name: 'render: --report flag', passed: false, detail: 'Report missing visible_parts or pivot_points' };
75
+ }
76
+ return { name: 'render: --report flag', passed: true };
77
+ }
78
+ async function testRenderCustomDimensions() {
79
+ const out = join(TEST_DIR, 'render-custom-dim.png');
80
+ const result = run(`${CLI} render ${TANK} -o ${out} --width 500 --height 500`);
81
+ if (result.exitCode !== 0) {
82
+ return { name: 'render: custom dimensions', passed: false, detail: result.stderr };
83
+ }
84
+ const report = JSON.parse(result.stdout);
85
+ if (report.dimensions.width !== 500 || report.dimensions.height !== 500) {
86
+ return { name: 'render: custom dimensions', passed: false, detail: `Got ${report.dimensions.width}x${report.dimensions.height}` };
87
+ }
88
+ return { name: 'render: custom dimensions', passed: true };
89
+ }
90
+ async function testRenderReportContents() {
91
+ const out = join(TEST_DIR, 'render-contents.png');
92
+ const result = run(`${CLI} render ${TANK} -o ${out}`);
93
+ const report = JSON.parse(result.stdout);
94
+ // Should have torso and head
95
+ const hasTorso = report.characters.some((c) => c.name === 'torso');
96
+ const hasHead = report.characters.some((c) => c.name === 'head');
97
+ if (!hasTorso || !hasHead) {
98
+ return { name: 'render: report has torso+head', passed: false, detail: 'Missing torso or head' };
99
+ }
100
+ // visible_parts should be non-empty
101
+ if (report.visible_parts.length === 0) {
102
+ return { name: 'render: report has torso+head', passed: false, detail: 'No visible parts' };
103
+ }
104
+ // pivot_points should be non-empty
105
+ if (report.pivot_points.length === 0) {
106
+ return { name: 'render: report has torso+head', passed: false, detail: 'No pivot points' };
107
+ }
108
+ // Each character should have bounds with x, y, w, h
109
+ for (const ch of report.characters) {
110
+ if (ch.bounds.x === undefined || ch.bounds.y === undefined || ch.bounds.w === undefined || ch.bounds.h === undefined) {
111
+ return { name: 'render: report has torso+head', passed: false, detail: `${ch.name} missing bounds` };
112
+ }
113
+ }
114
+ return { name: 'render: report has torso+head', passed: true };
115
+ }
116
+ // ─── VERIFY TESTS ───
117
+ async function testVerifyBasic() {
118
+ const result = run(`${CLI} verify ${TANK}`);
119
+ if (result.exitCode !== 0 && !result.stdout.includes('"failed"')) {
120
+ return { name: 'verify: basic', passed: false, detail: result.stderr };
121
+ }
122
+ try {
123
+ const report = JSON.parse(result.stdout);
124
+ if (!report.passed || !report.all_results) {
125
+ return { name: 'verify: basic', passed: false, detail: 'Missing passed or all_results' };
126
+ }
127
+ return { name: 'verify: basic', passed: true };
128
+ }
129
+ catch {
130
+ return { name: 'verify: basic', passed: false, detail: 'stdout not valid JSON' };
131
+ }
132
+ }
133
+ async function testVerifySelectiveChecks() {
134
+ const result = run(`${CLI} verify ${TANK} --checks bounds,proportions`);
135
+ const report = JSON.parse(result.stdout);
136
+ const checkNames = report.all_results.map((r) => r.check);
137
+ const hasBounds = checkNames.includes('bounds');
138
+ const hasProportions = checkNames.includes('proportions');
139
+ const hasZorder = checkNames.includes('zorder');
140
+ if (!hasBounds || !hasProportions) {
141
+ return { name: 'verify: selective checks', passed: false, detail: 'Missing requested checks' };
142
+ }
143
+ if (hasZorder) {
144
+ return { name: 'verify: selective checks', passed: false, detail: 'Ran check that was not requested (zorder)' };
145
+ }
146
+ return { name: 'verify: selective checks', passed: true };
147
+ }
148
+ async function testVerifyProportionsPass() {
149
+ const result = run(`${CLI} verify ${TANK} --checks proportions`);
150
+ const report = JSON.parse(result.stdout);
151
+ const proportionsCheck = report.all_results.find((r) => r.check === 'proportions');
152
+ if (!proportionsCheck || proportionsCheck.status !== 'passed') {
153
+ return { name: 'verify: proportions pass', passed: false, detail: `Status: ${proportionsCheck?.status}` };
154
+ }
155
+ return { name: 'verify: proportions pass', passed: true };
156
+ }
157
+ // ─── DIFF TESTS ───
158
+ async function testDiffIdentical() {
159
+ // Render same rig twice, diff should be 0%
160
+ const img1 = join(TEST_DIR, 'diff-a.png');
161
+ const img2 = join(TEST_DIR, 'diff-b.png');
162
+ const diffOut = join(TEST_DIR, 'diff-identical.png');
163
+ run(`${CLI} render ${TANK} -o ${img1} --width 500 --height 500`);
164
+ run(`${CLI} render ${TANK} -o ${img2} --width 500 --height 500`);
165
+ const result = run(`${CLI} diff ${img1} ${img2} -o ${diffOut}`);
166
+ if (result.exitCode !== 0) {
167
+ return { name: 'diff: identical images', passed: false, detail: result.stderr };
168
+ }
169
+ const report = JSON.parse(result.stdout);
170
+ if (report.percent_changed !== 0) {
171
+ return { name: 'diff: identical images', passed: false, detail: `Expected 0% changed, got ${report.percent_changed}%` };
172
+ }
173
+ return { name: 'diff: identical images', passed: true };
174
+ }
175
+ async function testDiffDifferent() {
176
+ // Use the rendered image vs the diff-identical image (which is dimmed) to guarantee different pixels
177
+ const img1 = join(TEST_DIR, 'diff-a.png');
178
+ const diffOut = join(TEST_DIR, 'diff-different.png');
179
+ const diffImg = join(TEST_DIR, 'diff-identical.png');
180
+ const result = run(`${CLI} diff ${img1} ${diffImg} -o ${diffOut}`);
181
+ if (result.exitCode !== 0) {
182
+ return { name: 'diff: different images', passed: false, detail: result.stderr };
183
+ }
184
+ const report = JSON.parse(result.stdout);
185
+ if (report.percent_changed === 0) {
186
+ return { name: 'diff: different images', passed: false, detail: 'Expected non-zero diff' };
187
+ }
188
+ if (!report.changed_regions || !Array.isArray(report.changed_regions)) {
189
+ return { name: 'diff: different images', passed: false, detail: 'Missing changed_regions' };
190
+ }
191
+ return { name: 'diff: different images', passed: true };
192
+ }
193
+ async function testDiffOutputFile() {
194
+ const img1 = join(TEST_DIR, 'diff-a.png');
195
+ const img1b = join(TEST_DIR, 'diff-identical.png');
196
+ const diffOut = join(TEST_DIR, 'diff-output-test.png');
197
+ run(`${CLI} diff ${img1} ${img1b} -o ${diffOut}`);
198
+ const exists = await fileExists(diffOut);
199
+ if (!exists) {
200
+ return { name: 'diff: output file created', passed: false, detail: 'Diff image not created' };
201
+ }
202
+ return { name: 'diff: output file created', passed: true };
203
+ }
204
+ // ─── QUERY TESTS (structural only, no API call) ───
205
+ async function testQueryMissingKey() {
206
+ // Without GEMINI_API_KEY, should exit with error
207
+ const img = join(TEST_DIR, 'diff-a.png');
208
+ const result = run(`unset GEMINI_API_KEY && GEMINI_API_KEY= ${CLI} query ${img} --prompt "test"`);
209
+ if (result.exitCode === 0) {
210
+ return { name: 'query: rejects without API key', passed: false, detail: 'Should have exited non-zero' };
211
+ }
212
+ const combinedOutput = result.stdout + result.stderr;
213
+ if (!combinedOutput.includes('GEMINI_API_KEY')) {
214
+ return { name: 'query: rejects without API key', passed: false, detail: 'Should mention GEMINI_API_KEY' };
215
+ }
216
+ return { name: 'query: rejects without API key', passed: true };
217
+ }
218
+ async function testQueryMissingPrompt() {
219
+ const img = join(TEST_DIR, 'diff-a.png');
220
+ const result = run(`GEMINI_API_KEY=fake ${CLI} query ${img}`);
221
+ if (result.exitCode === 0) {
222
+ return { name: 'query: rejects without --prompt', passed: false, detail: 'Should have exited non-zero' };
223
+ }
224
+ const combinedOutput = result.stdout + result.stderr;
225
+ if (!combinedOutput.includes('--prompt')) {
226
+ return { name: 'query: rejects without --prompt', passed: false, detail: 'Should mention --prompt' };
227
+ }
228
+ return { name: 'query: rejects without --prompt', passed: true };
229
+ }
230
+ // ─── CLI HELP TESTS ───
231
+ async function testHelpOutput() {
232
+ const result = run(`${CLI}`);
233
+ if (!result.stdout.includes('distark-check')) {
234
+ return { name: 'help: shows usage', passed: false, detail: 'Missing distark-check in output' };
235
+ }
236
+ if (!result.stdout.includes('render') || !result.stdout.includes('verify') || !result.stdout.includes('query')) {
237
+ return { name: 'help: shows usage', passed: false, detail: 'Missing command names' };
238
+ }
239
+ return { name: 'help: shows usage', passed: true };
240
+ }
241
+ async function testUnknownCommand() {
242
+ const result = run(`${CLI} foobar`);
243
+ if (result.exitCode === 0) {
244
+ return { name: 'help: unknown command exits non-zero', passed: false, detail: 'Should exit non-zero' };
245
+ }
246
+ return { name: 'help: unknown command exits non-zero', passed: true };
247
+ }
248
+ // ─── MAIN RUNNER ───
249
+ async function main() {
250
+ console.log('\n🧪 distark-check CLI Tests');
251
+ console.log('='.repeat(50));
252
+ // Setup test directory
253
+ await rm(TEST_DIR, { recursive: true, force: true });
254
+ await mkdir(TEST_DIR, { recursive: true });
255
+ const tests = [
256
+ // Help
257
+ testHelpOutput,
258
+ testUnknownCommand,
259
+ // Render
260
+ testRenderBasic,
261
+ testRenderWithReport,
262
+ testRenderCustomDimensions,
263
+ testRenderReportContents,
264
+ // Verify
265
+ testVerifyBasic,
266
+ testVerifySelectiveChecks,
267
+ testVerifyProportionsPass,
268
+ // Diff
269
+ testDiffIdentical,
270
+ testDiffDifferent,
271
+ testDiffOutputFile,
272
+ // Query (structural)
273
+ testQueryMissingKey,
274
+ testQueryMissingPrompt,
275
+ ];
276
+ const results = [];
277
+ for (const test of tests) {
278
+ try {
279
+ const result = await test();
280
+ results.push(result);
281
+ console.log(` ${result.passed ? '✅' : '❌'} ${result.name}${result.detail && !result.passed ? ` - ${result.detail}` : ''}`);
282
+ }
283
+ catch (err) {
284
+ const name = test.name || 'unknown';
285
+ results.push({ name, passed: false, detail: err.message });
286
+ console.log(` ❌ ${name} - ${err.message}`);
287
+ }
288
+ }
289
+ // Summary
290
+ const passed = results.filter(r => r.passed).length;
291
+ const total = results.length;
292
+ console.log('\n' + '='.repeat(50));
293
+ console.log(`📊 ${passed}/${total} tests passed`);
294
+ if (passed === total) {
295
+ console.log('✅ All CLI tests PASSED\n');
296
+ }
297
+ else {
298
+ console.log('❌ Some CLI tests FAILED\n');
299
+ results.filter(r => !r.passed).forEach(r => {
300
+ console.log(` ❌ ${r.name}: ${r.detail}`);
301
+ });
302
+ console.log();
303
+ }
304
+ process.exit(passed === total ? 0 : 1);
305
+ }
306
+ main();
307
+ //# sourceMappingURL=test-cli.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"test-cli.js","sourceRoot":"","sources":["../../tests/test-cli.ts"],"names":[],"mappings":"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"}
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
package/dist/types.d.ts CHANGED
File without changes
File without changes
package/dist/types.js CHANGED
File without changes
package/dist/types.js.map CHANGED
File without changes
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "distark-render",
3
- "version": "1.0.6",
3
+ "version": "1.0.7",
4
4
  "description": "Rendering-agnostic character rig system with TypeScript",
5
5
  "type": "module",
6
6
  "main": "./dist/modules/renderRig.js",
@@ -44,16 +44,23 @@
44
44
  "README.md",
45
45
  "LICENSE"
46
46
  ],
47
+ "bin": {
48
+ "distark-check": "./dist/cli/distark-check.js"
49
+ },
47
50
  "scripts": {
48
51
  "build": "tsc",
52
+ "check": "node dist/cli/distark-check.js",
53
+ "test-cli": "npm run build && node dist/tests/test-cli.js",
49
54
  "watch": "tsc --watch",
50
55
  "dev": "tsc --watch & http-server -p 8080",
51
56
  "clean": "rm -rf dist",
52
57
  "serve": "http-server -p 8080",
53
- "test": "npm run build && node dist/tests/test-visual-verification.js && node dist/tests/test-joint-movement.js",
58
+ "test": "npm run build && node dist/tests/test-animation-diff.js && node dist/tests/test-animation-diff-rendering.js && node dist/tests/test-visual-verification.js && node dist/tests/test-joint-movement.js",
54
59
  "test-skia": "npm run build && node dist/tests/test-skia.js",
55
60
  "test-visual": "npm run build && node dist/tests/test-visual-verification.js",
56
61
  "test-joints": "npm run build && node dist/tests/test-joint-movement.js",
62
+ "test-diff": "npm run build && node dist/tests/test-animation-diff.js",
63
+ "test-diff-render": "npm run build && node dist/tests/test-animation-diff-rendering.js",
57
64
  "prepublishOnly": "npm run clean && npm run build"
58
65
  },
59
66
  "keywords": [