test: golden-pin the four de-duplicated indicators across all bindings (#305)

* test: golden-pin the four de-duplicated indicators across all C-ABI bindings

Extend gen_golden to emit reference fixtures for AdOscillator (ADOSC),
IntradayIntensity, AwesomeOscillatorHistogram and AverageDrawdown, and replay
them through the Go / C# / Java / R golden harnesses so their corrected
definitions stay bit-identical to the Rust core in every binding. Go suite
verified locally (gcc 13 + cgo): all 9 golden tests pass; C#/Java/R use the
same fixtures and harness pattern (CI-verified). First step of extending the
golden coverage beyond the seven archetype representatives.

* test: golden-pin the scalar-output tranche (308 indicators) against Rust

Extend gen_golden with a generated emit_scalar that writes reference fixtures
for every single-f64-output indicator (scalar / candle / pairwise input) using
valid constructor params, and add a manifest-driven generic Python golden
replay that reconstructs each by its native name and checks it bit-for-bit
against the Rust output. 308 indicators now value-tied to the Rust core in
Python (pytest: 308/308). Takes golden coverage from the 7 archetype
representatives to 308+ of the catalogue.

22 scalar indicators with non-default constructor constraints are skipped by
gen_golden for now (logged), as are non-f64-output ones; multi-output, exotic
inputs and the per-indicator arg arities of the C-ABI/Node replays follow.
Generated + verified locally with the full toolchain.

* test: golden-pin the multi-output tranche (70 indicators) in Python

Add a generated emit_multi to gen_golden (per-indicator Output-field access,
one CSV column per field) and a manifest-driven generic Python replay that
checks every field of each multi-output indicator against the Rust reference.
70 multi-output indicators now value-tied to Rust in Python; combined with the
scalar tranche, 378 indicators are golden-pinned. 8 multi with non-default
param constraints and 5 with non-f64 Output fields (Option/Vec/i64) are
deferred. pytest green.

* test(golden): add 30 constraint-tuned indicators to scalar/multi golden suite

Emit golden fixtures for 22 scalar-output and 8 multi-output indicators
whose constructors need non-default parameters (Alma, Jma, Psar, T3, Mama,
DoubleBollinger, ZigZag, ...). All 408 fixtures replay bit-for-bit through
the Python binding.

* test(golden): cover 36 missed scalar/multi indicators

Add 26 single-output (LinearRegression family, HT cycle, Candle
volatility estimators, DrawdownDuration) and 10 multi-output
(BollingerBands, MACD/MACDEXT/MACDFIX, Camarilla, VWAP bands, ...)
indicators to the golden suite. 444 fixtures replay bit-for-bit
through the Python binding.

* test(golden): cover 50 exotic-input indicators

Add deterministic synthetic feeders for the DerivativesTick (17),
CrossSection (15), Trade (8), TradeQuote (3) and OrderBook (7)
families, derived from the shared OHLCV input series in both
gen_golden and a new Python replay harness (test_golden_exotic).
All 494 fixtures replay bit-for-bit through the Python binding.

* test(golden): complete 514-indicator golden coverage

Add the final tranches: 3 mixed multi-output indicators (Ichimoku,
WilliamsFractals, LeadLagCrossCorrelation), 6 histogram profiles
(time/volume seasonality + TPO/volume price profiles), 10 alt-chart
bar builders and the footprint. Every one of the 514 distinct
indicators now has a Rust-generated g_<Canonical>.csv fixture and a
generic Python replay (scalar/multi/exotic/profile/bars), all passing
bit-for-bit.

* test(golden): add generic Node replay for all 514 indicators

A manifest-driven node:test harness reconstructs every indicator by its
native class, feeds the same synthetic stream derived from the shared
golden input, and checks output bit-for-bit against the Rust reference
fixtures (scalar/multi/exotic/profile/bars). node_manifest.json is
generated from index.d.ts plus the Python-side manifests. 514/514 pass.

* test(golden): add generated Go replay for all 514 indicators

golden_all_test.go (generated by gen_golden_test.py) reconstructs every
Go indicator, feeds the shared synthetic stream and checks output
bit-for-bit against the Rust reference fixtures. A reflection-based
comparator flattens multi-output structs, profiles and bar slices so one
path covers all archetypes. This is the first C-ABI binding verified
across the full catalogue. 514/514 pass.

* test(golden): add generated C# replay for all 514 indicators

GoldenAllTests.g.cs (generated by gen_golden_test.py) reconstructs every
C# indicator, feeds the shared synthetic stream and checks output
bit-for-bit against the Rust reference fixtures via a reflection-based
flatten covering scalar/multi/profile/bar archetypes. 514/514 pass.

Also add the '#nullable enable' directive the compiler requires to the
generated Indicators.g.cs, clearing the four CS8669 warnings on the
nullable double[] profile return types.

* fix(java): marshal C ABI bool params correctly; add 514 golden replay

The Java FFM binding marshalled the cross-section state flags (newHigh,
newLow, aboveMa, onBuySignal) as JAVA_DOUBLE arrays, but the C ABI takes
them as const bool* (one byte each), so the native side read the low byte
of each 8-byte double and saw every flag as false. Add WickraNative.
boolSegment and use it across the 15 cross-section indicators. Also pass
the MacdExt MaType arguments as byte to match the uint8_t downcall
descriptor (was int, throwing WrongMethodTypeException).

Add GoldenAllTest.java (generated by gen_golden_test.py): a reflection
runner replaying all 514 indicators against the Rust reference fixtures.
The bugs above were found by this test; 514/514 now pass.

* fix(r): marshal C ABI bool flags correctly; add 514 golden replay

The R wrapper passed the cross-section state flags as (bool *)REAL(x),
reinterpreting the 8-byte doubles as 1-byte bools so the native side read
every flag as false. Add wk_bool_vec to convert each flag vector into a
real C bool buffer and use it for all 15 cross-section update wrappers.

Add test-golden-all.R + generated golden_specs.R: a reflective runner
replaying all 514 indicators against the Rust reference fixtures. The bug
above was found by this test; verified 514/514 pass locally.

* test(golden): add WASM replay for all 514 indicators

A manifest-driven node:test harness loads the nodejs-target wasm-pack
build, reconstructs every indicator by its JS class, feeds the shared
synthetic stream and checks output bit-for-bit against the Rust
reference fixtures. wasm_manifest.json is generated from the wasm .d.ts
plus the shared manifests; a recursive flattener covers scalar, multi
(Reflect objects), profile and bar shapes. 514/514 pass locally
(wasm-pack build --target nodejs, then node --test).

* test(golden): add C and C++ replay for all 514 indicators

golden_test.c (generated by gen_golden_test.py) drives every indicator
through the C ABI (wickra.h) and checks output bit-for-bit against the
Rust reference fixtures. golden_test.cpp #includes the same source so the
identical runner is compiled and run under both gcc (C) and g++ (C++) via
the CMake targets golden_test / golden_test_cpp — proving the extern "C"
header is consumable from each language. Both 514/514 (verified via ctest).

* test(golden): gofmt the generated Go golden replay

* test(golden): make the Node fixture reader CRLF-safe and pin fixtures to LF
This commit is contained in:
kingchenc
2026-06-15 04:48:51 +02:00
committed by GitHub
parent de1112ea91
commit 4f708d410d
573 changed files with 102337 additions and 77 deletions
+81
View File
@@ -0,0 +1,81 @@
DecyclerOscillator
0
0
-0.07751784410081086
-0.2928777235131008
-0.5963479925408279
-0.9238487249057812
-1.2176914142460618
-1.4324090362493536
-1.536661166568635
-1.5137521107566982
-1.3613710553485419
-1.0906111346094036
-0.7242255617591979
-0.2941372997525207
0.16168302018087388
0.602765386340721
0.9898445603597423
1.2884176071530788
1.4718538094387412
1.5237888896795369
1.4395952092523032
1.2267997315407797
0.9044141478168086
0.5012379611042945
0.053286633210248624
-0.3994251832410498
-0.816457828532478
-1.160558880556593
-1.400990744512498
-1.5162763198626124
-1.496117469455612
-1.3423149128452252
-1.0686073688446527
-0.6994443143098295
-0.26780198393748833
0.187762299224687
0.6265543349561256
1.0093781377510993
1.3020371975623561
1.4783891522469048
1.5226810069431735
1.430956302198993
1.2114085327180106
0.8836492468837776
0.4769562055525114
0.027658086873458387
-0.42411064633390083
-0.8379948386126728
-1.1770234477174313
-1.4109120577091971
-1.5187680956364034
-1.4909571028533435
-1.329963352517197
-1.0501679368656909
-0.6765641470778831
-0.24252489700961632
0.2131783798084541
0.6498390668570266
1.0284515654472273
1.3151955486831355
1.4844570305379392
1.521116386940733
1.4218989467648129
1.195667508446661
0.8626306525972041
0.45253756968199355
0.0020206534376825402
-0.4486767617602254
-0.8592952181021758
-1.1931553918081192
-1.420434547880319
-1.5208305162013005
-1.4853752239253026
-1.317235786716651
-1.0314315997396761
-0.65349269982039
-0.21717924329152538
0.23853418822619687
0.6729400711244296
1.0472342216536674
1 DecyclerOscillator
2 0
3 0
4 -0.07751784410081086
5 -0.2928777235131008
6 -0.5963479925408279
7 -0.9238487249057812
8 -1.2176914142460618
9 -1.4324090362493536
10 -1.536661166568635
11 -1.5137521107566982
12 -1.3613710553485419
13 -1.0906111346094036
14 -0.7242255617591979
15 -0.2941372997525207
16 0.16168302018087388
17 0.602765386340721
18 0.9898445603597423
19 1.2884176071530788
20 1.4718538094387412
21 1.5237888896795369
22 1.4395952092523032
23 1.2267997315407797
24 0.9044141478168086
25 0.5012379611042945
26 0.053286633210248624
27 -0.3994251832410498
28 -0.816457828532478
29 -1.160558880556593
30 -1.400990744512498
31 -1.5162763198626124
32 -1.496117469455612
33 -1.3423149128452252
34 -1.0686073688446527
35 -0.6994443143098295
36 -0.26780198393748833
37 0.187762299224687
38 0.6265543349561256
39 1.0093781377510993
40 1.3020371975623561
41 1.4783891522469048
42 1.5226810069431735
43 1.430956302198993
44 1.2114085327180106
45 0.8836492468837776
46 0.4769562055525114
47 0.027658086873458387
48 -0.42411064633390083
49 -0.8379948386126728
50 -1.1770234477174313
51 -1.4109120577091971
52 -1.5187680956364034
53 -1.4909571028533435
54 -1.329963352517197
55 -1.0501679368656909
56 -0.6765641470778831
57 -0.24252489700961632
58 0.2131783798084541
59 0.6498390668570266
60 1.0284515654472273
61 1.3151955486831355
62 1.4844570305379392
63 1.521116386940733
64 1.4218989467648129
65 1.195667508446661
66 0.8626306525972041
67 0.45253756968199355
68 0.0020206534376825402
69 -0.4486767617602254
70 -0.8592952181021758
71 -1.1931553918081192
72 -1.420434547880319
73 -1.5208305162013005
74 -1.4853752239253026
75 -1.317235786716651
76 -1.0314315997396761
77 -0.65349269982039
78 -0.21717924329152538
79 0.23853418822619687
80 0.6729400711244296
81 1.0472342216536674