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 @@
median,upper,lower
nan,nan,nan
nan,nan,nan
nan,nan,nan
nan,nan,nan
nan,nan,nan
nan,nan,nan
nan,nan,nan
nan,nan,nan
nan,nan,nan
nan,nan,nan
nan,nan,nan
nan,nan,nan
nan,nan,nan
nan,nan,nan
nan,nan,nan
nan,nan,nan
nan,nan,nan
nan,nan,nan
nan,nan,nan
nan,nan,nan
nan,nan,nan
nan,nan,nan
nan,nan,nan
nan,nan,nan
nan,nan,nan
nan,nan,nan
nan,nan,nan
nan,nan,nan
nan,nan,nan
nan,nan,nan
nan,nan,nan
nan,nan,nan
nan,nan,nan
nan,nan,nan
nan,nan,nan
nan,nan,nan
nan,nan,nan
nan,nan,nan
nan,nan,nan
nan,nan,nan
nan,nan,nan
nan,nan,nan
nan,nan,nan
nan,nan,nan
nan,nan,nan
nan,nan,nan
nan,nan,nan
nan,nan,nan
nan,nan,nan
nan,nan,nan
nan,nan,nan
138.13379981168666,153.5903388831148,122.67726074025849
139.30589937241328,154.76243844384143,123.84936030098511
140.4779989331399,155.93453800456805,125.02145986171173
141.65009849386652,157.10663756529468,126.19355942243835
142.82219805459314,158.2787371260213,127.36565898316498
143.99429761531977,159.45083668674792,128.53775854389158
145.16639717604642,160.62293624747457,129.70985810461826
146.33849673677304,161.7950358082012,130.88195766534488
147.51059629749966,162.9671353689278,132.0540572260715
148.68269585822628,164.13923492965444,133.22615678679813
149.8547954189529,165.31133449038106,134.39825634752475
116.38708046816012,131.99293946067135,100.78122147564889
116.16761465158264,131.77347364409388,100.56175565907141
115.94814883500517,131.5540078275164,100.34228984249394
115.72868301842769,131.33454201093892,100.12282402591646
115.50921720185022,131.11507619436145,99.90335820933899
115.28975138527275,130.89561037778398,99.68389239276152
115.07028556869527,130.6761445612065,99.46442657618404
114.8508197521178,130.45667874462902,99.24496075960657
114.63135393554032,130.23721292805155,99.02549494302909
149.90312728485273,164.58343115980426,135.22282340990122
151.1865172964635,165.86682117141504,136.506213421512
152.4699073080743,167.15021118302582,137.7896034331228
153.7532973196851,168.4336011946366,139.07299344473358
155.0366873312959,169.71699120624743,140.3563834563444
156.3200773429067,171.0003812178582,141.6397734679552
157.60346735451748,172.28377122946898,142.92316347956597
158.88685736612828,173.56716124107982,144.20655349117678
160.17024737773906,174.8505512526906,145.48994350278755
1 median upper lower
2 nan nan nan
3 nan nan nan
4 nan nan nan
5 nan nan nan
6 nan nan nan
7 nan nan nan
8 nan nan nan
9 nan nan nan
10 nan nan nan
11 nan nan nan
12 nan nan nan
13 nan nan nan
14 nan nan nan
15 nan nan nan
16 nan nan nan
17 nan nan nan
18 nan nan nan
19 nan nan nan
20 nan nan nan
21 nan nan nan
22 nan nan nan
23 nan nan nan
24 nan nan nan
25 nan nan nan
26 nan nan nan
27 nan nan nan
28 nan nan nan
29 nan nan nan
30 nan nan nan
31 nan nan nan
32 nan nan nan
33 nan nan nan
34 nan nan nan
35 nan nan nan
36 nan nan nan
37 nan nan nan
38 nan nan nan
39 nan nan nan
40 nan nan nan
41 nan nan nan
42 nan nan nan
43 nan nan nan
44 nan nan nan
45 nan nan nan
46 nan nan nan
47 nan nan nan
48 nan nan nan
49 nan nan nan
50 nan nan nan
51 nan nan nan
52 nan nan nan
53 138.13379981168666 153.5903388831148 122.67726074025849
54 139.30589937241328 154.76243844384143 123.84936030098511
55 140.4779989331399 155.93453800456805 125.02145986171173
56 141.65009849386652 157.10663756529468 126.19355942243835
57 142.82219805459314 158.2787371260213 127.36565898316498
58 143.99429761531977 159.45083668674792 128.53775854389158
59 145.16639717604642 160.62293624747457 129.70985810461826
60 146.33849673677304 161.7950358082012 130.88195766534488
61 147.51059629749966 162.9671353689278 132.0540572260715
62 148.68269585822628 164.13923492965444 133.22615678679813
63 149.8547954189529 165.31133449038106 134.39825634752475
64 116.38708046816012 131.99293946067135 100.78122147564889
65 116.16761465158264 131.77347364409388 100.56175565907141
66 115.94814883500517 131.5540078275164 100.34228984249394
67 115.72868301842769 131.33454201093892 100.12282402591646
68 115.50921720185022 131.11507619436145 99.90335820933899
69 115.28975138527275 130.89561037778398 99.68389239276152
70 115.07028556869527 130.6761445612065 99.46442657618404
71 114.8508197521178 130.45667874462902 99.24496075960657
72 114.63135393554032 130.23721292805155 99.02549494302909
73 149.90312728485273 164.58343115980426 135.22282340990122
74 151.1865172964635 165.86682117141504 136.506213421512
75 152.4699073080743 167.15021118302582 137.7896034331228
76 153.7532973196851 168.4336011946366 139.07299344473358
77 155.0366873312959 169.71699120624743 140.3563834563444
78 156.3200773429067 171.0003812178582 141.6397734679552
79 157.60346735451748 172.28377122946898 142.92316347956597
80 158.88685736612828 173.56716124107982 144.20655349117678
81 160.17024737773906 174.8505512526906 145.48994350278755