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 @@
pivot,tc,bc
99.66666666666667,99.83333333333334,99.5
103.16267454598328,103.30893830629836,103.0164107856682
106.46632396532765,106.55637434963901,106.37627358101628
109.30969002905226,109.32147956266354,109.29790049544098
111.45910647185464,111.52846427794583,111.38974866576345
112.74199773788952,112.875521673814,112.60847380196503
113.06847380764877,113.23347255708218,112.90347505821536
112.44424589558567,112.60032201013414,112.2881697810372
110.97251301246604,111.08145361594332,110.86357240898876
108.84406406881523,108.87919670205369,108.80893143557677
106.3166460187776,106.36392304968814,106.26936898786707
103.68631980047041,103.80443142951896,103.56820817142187
101.25473880483469,101.41476718594308,101.0947104237263
99.29680919958425,99.45957380387225,99.13404459529625
98.03294152441634,98.15859190014022,97.90729114869247
97.60915371740403,97.66692627037654,97.55138116443152
98.08685392291113,98.1111039285459,98.06260391727636
99.44252381095095,99.54285912806509,99.3421884938368
101.57606521173501,101.72792025538246,101.42421016808757
104.32553529275576,104.49173065212182,104.1593399333897
107.48553552770288,107.62538078254896,107.3456902728568
110.82665131417549,110.90590746884149,110.7473951595095
114.11393840247109,114.11467601880244,114.11320078613974
117.12329605763098,117.20384685075648,117.04274526450548
119.6553939855807,119.79603631203612,119.51475165912528
121.54740034135453,121.71370005455097,121.3811006281581
122.68295119326267,122.83419232350437,122.53171006302097
123.0005912206809,123.09974466456589,122.90143777679592
122.50041000814686,122.52319954451482,122.47762047177889
121.2480003897514,121.30715443421619,121.1888463452866
119.37441415670385,119.50102880884698,119.24779950456072
117.0706953893436,117.23377096648008,116.90761981220712
114.57595201454465,114.73556192793188,114.41634210115743
112.1587734147477,112.27583959099815,112.04170723849725
110.09297423674845,110.13883479309038,110.04711368040651
108.62989574587948,108.6664690730814,108.59332241867756
107.97053212992039,108.08058491462774,107.86047934521304
108.24129915337737,108.39788663566875,108.08471167108598
109.47714653729103,109.64193064032216,109.31236243425991
111.61489250420503,111.74752833250736,111.4822566759027
114.49824346605784,114.56625714302673,114.43022978908895
117.8942032754348,117.90746386998124,117.88094268088837
121.51880689228612,121.6100951023235,121.42751868224875
125.06867496722403,125.21564025514759,124.92170967930046
128.2540554225371,128.42071556026954,128.08739528480467
130.82894581221407,130.97449658556297,130.68339503886517
132.61456770121885,132.70337320460774,132.52576219782995
133.51372898547731,133.52404653447638,133.50341143647825
133.51518476304713,133.58588126426997,133.4444882618243
132.68866514679192,132.82306672911062,132.55426356447322
131.17247746428333,131.33767793292725,131.00727699563942
129.1563006939515,129.31185321262882,129.00074817527417
126.86189674888487,126.96971663593965,126.7540768618301
124.52403581279573,124.55772499952693,124.49034662606454
122.37315973892662,122.42184954038225,122.32446993747098
120.62044223256866,120.7395900606986,120.50129440443872
119.44519828628948,119.60563259734174,119.28476397523723
118.98423170775713,119.14667258704391,118.82179082847036
119.32275870519,119.44743496013817,119.19808245024183
120.48694857241185,120.54333510757368,120.43056203725001
122.4387103823207,122.46441895730197,122.41300180733944
125.07389544503057,125.17540477438165,124.9723861156795
128.2253492633656,128.37780632299967,128.0728922037315
131.67207090888238,131.83814889347522,131.50599292428953
135.15507483469676,135.29411206144783,135.0160376079457
138.3994880837803,138.47744339048813,138.3215327770725
141.1411629574787,141.14337574868256,141.13895016627487
143.154923777789,143.23676289844406,143.07308465713396
144.28078575968826,144.42221413881902,144.1393573805575
144.44430932083742,144.61070035874553,144.2779182829293
143.66778712039107,143.81840248790633,143.5171717528758
142.07015356602253,142.1681173682826,141.97218976376246
139.85515947975856,139.8764867613631,139.833832198154
137.28916235919314,137.3496932605958,137.22863145779047
134.6714977766173,134.79906678527485,134.54392876795973
132.3015073284582,132.46488110192655,132.13813355498985
130.44669455820846,130.605873498883,130.28751561753393
129.31610321851522,129.43211477015922,129.20009166687123
129.04196344134022,129.08640393006687,128.99752295261356
129.6711671025228,129.70917825826996,129.63315594677562
1 pivot tc bc
2 99.66666666666667 99.83333333333334 99.5
3 103.16267454598328 103.30893830629836 103.0164107856682
4 106.46632396532765 106.55637434963901 106.37627358101628
5 109.30969002905226 109.32147956266354 109.29790049544098
6 111.45910647185464 111.52846427794583 111.38974866576345
7 112.74199773788952 112.875521673814 112.60847380196503
8 113.06847380764877 113.23347255708218 112.90347505821536
9 112.44424589558567 112.60032201013414 112.2881697810372
10 110.97251301246604 111.08145361594332 110.86357240898876
11 108.84406406881523 108.87919670205369 108.80893143557677
12 106.3166460187776 106.36392304968814 106.26936898786707
13 103.68631980047041 103.80443142951896 103.56820817142187
14 101.25473880483469 101.41476718594308 101.0947104237263
15 99.29680919958425 99.45957380387225 99.13404459529625
16 98.03294152441634 98.15859190014022 97.90729114869247
17 97.60915371740403 97.66692627037654 97.55138116443152
18 98.08685392291113 98.1111039285459 98.06260391727636
19 99.44252381095095 99.54285912806509 99.3421884938368
20 101.57606521173501 101.72792025538246 101.42421016808757
21 104.32553529275576 104.49173065212182 104.1593399333897
22 107.48553552770288 107.62538078254896 107.3456902728568
23 110.82665131417549 110.90590746884149 110.7473951595095
24 114.11393840247109 114.11467601880244 114.11320078613974
25 117.12329605763098 117.20384685075648 117.04274526450548
26 119.6553939855807 119.79603631203612 119.51475165912528
27 121.54740034135453 121.71370005455097 121.3811006281581
28 122.68295119326267 122.83419232350437 122.53171006302097
29 123.0005912206809 123.09974466456589 122.90143777679592
30 122.50041000814686 122.52319954451482 122.47762047177889
31 121.2480003897514 121.30715443421619 121.1888463452866
32 119.37441415670385 119.50102880884698 119.24779950456072
33 117.0706953893436 117.23377096648008 116.90761981220712
34 114.57595201454465 114.73556192793188 114.41634210115743
35 112.1587734147477 112.27583959099815 112.04170723849725
36 110.09297423674845 110.13883479309038 110.04711368040651
37 108.62989574587948 108.6664690730814 108.59332241867756
38 107.97053212992039 108.08058491462774 107.86047934521304
39 108.24129915337737 108.39788663566875 108.08471167108598
40 109.47714653729103 109.64193064032216 109.31236243425991
41 111.61489250420503 111.74752833250736 111.4822566759027
42 114.49824346605784 114.56625714302673 114.43022978908895
43 117.8942032754348 117.90746386998124 117.88094268088837
44 121.51880689228612 121.6100951023235 121.42751868224875
45 125.06867496722403 125.21564025514759 124.92170967930046
46 128.2540554225371 128.42071556026954 128.08739528480467
47 130.82894581221407 130.97449658556297 130.68339503886517
48 132.61456770121885 132.70337320460774 132.52576219782995
49 133.51372898547731 133.52404653447638 133.50341143647825
50 133.51518476304713 133.58588126426997 133.4444882618243
51 132.68866514679192 132.82306672911062 132.55426356447322
52 131.17247746428333 131.33767793292725 131.00727699563942
53 129.1563006939515 129.31185321262882 129.00074817527417
54 126.86189674888487 126.96971663593965 126.7540768618301
55 124.52403581279573 124.55772499952693 124.49034662606454
56 122.37315973892662 122.42184954038225 122.32446993747098
57 120.62044223256866 120.7395900606986 120.50129440443872
58 119.44519828628948 119.60563259734174 119.28476397523723
59 118.98423170775713 119.14667258704391 118.82179082847036
60 119.32275870519 119.44743496013817 119.19808245024183
61 120.48694857241185 120.54333510757368 120.43056203725001
62 122.4387103823207 122.46441895730197 122.41300180733944
63 125.07389544503057 125.17540477438165 124.9723861156795
64 128.2253492633656 128.37780632299967 128.0728922037315
65 131.67207090888238 131.83814889347522 131.50599292428953
66 135.15507483469676 135.29411206144783 135.0160376079457
67 138.3994880837803 138.47744339048813 138.3215327770725
68 141.1411629574787 141.14337574868256 141.13895016627487
69 143.154923777789 143.23676289844406 143.07308465713396
70 144.28078575968826 144.42221413881902 144.1393573805575
71 144.44430932083742 144.61070035874553 144.2779182829293
72 143.66778712039107 143.81840248790633 143.5171717528758
73 142.07015356602253 142.1681173682826 141.97218976376246
74 139.85515947975856 139.8764867613631 139.833832198154
75 137.28916235919314 137.3496932605958 137.22863145779047
76 134.6714977766173 134.79906678527485 134.54392876795973
77 132.3015073284582 132.46488110192655 132.13813355498985
78 130.44669455820846 130.605873498883 130.28751561753393
79 129.31610321851522 129.43211477015922 129.20009166687123
80 129.04196344134022 129.08640393006687 128.99752295261356
81 129.6711671025228 129.70917825826996 129.63315594677562