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 @@
upper,middle,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
115.75259017925208,107.71011176814433,99.66763335703658
115.75259017925208,107.71011176814433,99.66763335703658
115.91966237606556,107.71011176814433,99.5005611602231
117.0145440910608,107.59249944146849,98.17045479187618
117.24540925253268,105.1668715695831,93.0883338866335
111.92341175092278,102.7486693128095,93.57392687469621
110.87562711754406,102.7486693128095,94.62171150807494
110.86837578579991,102.7486693128095,94.62896283981908
110.86837578579991,102.7486693128095,94.62896283981908
110.86837578579991,102.7486693128095,94.62896283981908
110.86837578579991,102.7486693128095,94.62896283981908
111.67027205495611,102.7486693128095,93.82706657066288
112.02931402410694,102.78397007053755,93.53862611696816
120.47588820054584,105.59949479601718,90.72310139148853
129.28488058169458,108.93699201142712,88.58910344115966
132.03421252864155,112.39177631998864,92.74934011133571
129.83151689512098,115.69990563950788,101.56829438389477
127.32863128647908,118.20279124814978,109.07695120982048
126.63336669389881,118.20279124814978,109.77221580240075
126.23622792154536,118.20279124814978,110.1693545747542
126.23622792154536,118.20279124814978,110.1693545747542
126.23622792154536,118.20279124814978,110.1693545747542
126.23622792154536,118.20279124814978,110.1693545747542
126.49204814126239,118.20279124814978,109.91353435503717
127.59855799088476,117.9328645437441,108.26717109660345
127.57392323581456,115.50063821142041,103.42735318702626
122.01454335678206,113.09068662500849,104.16682989323492
121.13218845979583,113.09068662500849,105.04918479022115
121.13218845979583,113.09068662500849,105.04918479022115
121.13218845979583,113.09068662500849,105.04918479022115
121.13218845979583,113.09068662500849,105.04918479022115
121.13218845979583,113.09068662500849,105.04918479022115
122.01454335678206,113.09068662500849,104.16682989323492
122.59266390950309,113.27945594112123,103.96624797273937
131.49541284126303,116.25097645316882,101.00654006507459
140.29611169419346,119.60195627927666,98.90780086435987
142.33893757407625,123.05548743179415,103.77203728951204
140.10282242968395,126.34773976922457,112.5926571087652
137.75649175971932,128.6940704391892,119.63164911865908
136.87679435924161,128.6940704391892,120.51134651913678
136.71605273993256,128.6940704391892,120.67208813844584
136.71605273993256,128.6940704391892,120.67208813844584
136.71605273993256,128.6940704391892,120.67208813844584
136.71605273993256,128.6940704391892,120.67208813844584
137.06012456436042,128.6940704391892,120.32801631401797
138.17809107175825,128.27247112715028,118.36685118254232
138.10535974138594,125.83447535462628,113.56359096786662
132.4245767183334,123.54077085927068,114.65696500020795
131.49397771808015,123.54077085927068,115.5875640004612
131.49397771808015,123.54077085927068,115.5875640004612
131.49397771808015,123.54077085927068,115.5875640004612
131.49397771808015,123.54077085927068,115.5875640004612
131.49397771808015,123.54077085927068,115.5875640004612
132.4245767183334,123.54077085927068,114.65696500020795
133.45282659454523,123.88352081800795,114.31421504147067
142.51303037007102,126.90358874318322,111.2941471162954
151.02980700333384,130.26724513035094,109.50468325736804
152.63911383870598,133.71868808313351,114.79826232756105
150.3702113940898,136.99427399269746,123.61833659130511
148.18053357991457,139.1839518068727,130.18737003383083
147.1738501149668,139.1839518068727,131.1940534987786
147.1738501149668,139.1839518068727,131.1940534987786
147.1738501149668,139.1839518068727,131.1940534987786
147.1738501149668,139.1839518068727,131.1940534987786
147.1738501149668,139.1839518068727,131.1940534987786
147.62387239830085,139.1839518068727,130.74403121544455
148.75312084751332,138.61136453927395,128.46960823103458
1 upper middle 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 115.75259017925208 107.71011176814433 99.66763335703658
16 115.75259017925208 107.71011176814433 99.66763335703658
17 115.91966237606556 107.71011176814433 99.5005611602231
18 117.0145440910608 107.59249944146849 98.17045479187618
19 117.24540925253268 105.1668715695831 93.0883338866335
20 111.92341175092278 102.7486693128095 93.57392687469621
21 110.87562711754406 102.7486693128095 94.62171150807494
22 110.86837578579991 102.7486693128095 94.62896283981908
23 110.86837578579991 102.7486693128095 94.62896283981908
24 110.86837578579991 102.7486693128095 94.62896283981908
25 110.86837578579991 102.7486693128095 94.62896283981908
26 111.67027205495611 102.7486693128095 93.82706657066288
27 112.02931402410694 102.78397007053755 93.53862611696816
28 120.47588820054584 105.59949479601718 90.72310139148853
29 129.28488058169458 108.93699201142712 88.58910344115966
30 132.03421252864155 112.39177631998864 92.74934011133571
31 129.83151689512098 115.69990563950788 101.56829438389477
32 127.32863128647908 118.20279124814978 109.07695120982048
33 126.63336669389881 118.20279124814978 109.77221580240075
34 126.23622792154536 118.20279124814978 110.1693545747542
35 126.23622792154536 118.20279124814978 110.1693545747542
36 126.23622792154536 118.20279124814978 110.1693545747542
37 126.23622792154536 118.20279124814978 110.1693545747542
38 126.49204814126239 118.20279124814978 109.91353435503717
39 127.59855799088476 117.9328645437441 108.26717109660345
40 127.57392323581456 115.50063821142041 103.42735318702626
41 122.01454335678206 113.09068662500849 104.16682989323492
42 121.13218845979583 113.09068662500849 105.04918479022115
43 121.13218845979583 113.09068662500849 105.04918479022115
44 121.13218845979583 113.09068662500849 105.04918479022115
45 121.13218845979583 113.09068662500849 105.04918479022115
46 121.13218845979583 113.09068662500849 105.04918479022115
47 122.01454335678206 113.09068662500849 104.16682989323492
48 122.59266390950309 113.27945594112123 103.96624797273937
49 131.49541284126303 116.25097645316882 101.00654006507459
50 140.29611169419346 119.60195627927666 98.90780086435987
51 142.33893757407625 123.05548743179415 103.77203728951204
52 140.10282242968395 126.34773976922457 112.5926571087652
53 137.75649175971932 128.6940704391892 119.63164911865908
54 136.87679435924161 128.6940704391892 120.51134651913678
55 136.71605273993256 128.6940704391892 120.67208813844584
56 136.71605273993256 128.6940704391892 120.67208813844584
57 136.71605273993256 128.6940704391892 120.67208813844584
58 136.71605273993256 128.6940704391892 120.67208813844584
59 137.06012456436042 128.6940704391892 120.32801631401797
60 138.17809107175825 128.27247112715028 118.36685118254232
61 138.10535974138594 125.83447535462628 113.56359096786662
62 132.4245767183334 123.54077085927068 114.65696500020795
63 131.49397771808015 123.54077085927068 115.5875640004612
64 131.49397771808015 123.54077085927068 115.5875640004612
65 131.49397771808015 123.54077085927068 115.5875640004612
66 131.49397771808015 123.54077085927068 115.5875640004612
67 131.49397771808015 123.54077085927068 115.5875640004612
68 132.4245767183334 123.54077085927068 114.65696500020795
69 133.45282659454523 123.88352081800795 114.31421504147067
70 142.51303037007102 126.90358874318322 111.2941471162954
71 151.02980700333384 130.26724513035094 109.50468325736804
72 152.63911383870598 133.71868808313351 114.79826232756105
73 150.3702113940898 136.99427399269746 123.61833659130511
74 148.18053357991457 139.1839518068727 130.18737003383083
75 147.1738501149668 139.1839518068727 131.1940534987786
76 147.1738501149668 139.1839518068727 131.1940534987786
77 147.1738501149668 139.1839518068727 131.1940534987786
78 147.1738501149668 139.1839518068727 131.1940534987786
79 147.1738501149668 139.1839518068727 131.1940534987786
80 147.62387239830085 139.1839518068727 130.74403121544455
81 148.75312084751332 138.61136453927395 128.46960823103458