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 @@
jaw,teeth,lips
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
103.1558507984203,105.79078781985666,107.03252484838644
101.40633091517769,104.66457400969036,106.38072244126543
100.12134766492898,103.6484036032248,105.75005520720586
99.45126641946796,102.85736079255639,105.20441583015872
99.48179732233366,102.38386055477191,104.80001892286633
100.23050496668327,102.29015479771627,104.58058330376035
101.65091352849612,102.60466563405991,104.57423668578618
103.64240261318041,103.32191065527263,104.79217554984066
106.06357089840077,104.40533877149676,105.22887068691215
108.74678086098042,105.79217620216004,105.86346569399983
111.51210232882211,107.39940035392367,106.66198566332166
114.17965210558982,109.13016482609532,107.58004037730764
116.58013494644592,110.88029851210429,108.56583039522552
118.5639933186376,112.54478587652095,109.56339322863947
120.0098081380237,114.02430757656022,110.51611069636495
120.83241224927542,115.2319237044486,111.37050425175165
120.99065964425567,116.09981380870111,112.08026497907055
120.49411603245278,116.5857016658648,112.61031953834029
119.4073343437952,116.67828299452412,112.94056606892171
117.85007687184077,116.40075141358238,113.068780058851
115.99199777822656,115.81147829607036,113.01214145400436
114.04094344984783,115.0011006527875,112.80690526393907
112.22506977279107,114.08570376220037,112.50593506070611
110.77020629693173,113.19638598834503,112.17411679531374
109.87504142164983,112.46614680016516,111.88201642929747
109.68748175918653,112.01560617646442,111.69846971536622
110.2857400647586,111.93941339066988,111.6830259268331
111.66723663953537,112.29524430472975,111.87925477413708
113.74731238301733,113.09698995690853,112.30984113812596
116.3682399561194,114.31314783482495,112.97414499271152
119.3173733891288,115.87064675201391,113.84853751145694
122.35182077950905,117.66351372462186,114.88940737208642
125.22604604819371,119.5650827047563,116.03834231590618
127.71848843366506,121.44198134759222,117.22870166509915
129.65367446726884,123.16799066000424,118.39265487005467
130.91727906545398,124.63606174597852,119.46778582660964
131.46294056512707,125.76723343433491,120.40253423645706
131.3110527086312,126.51581108594984,121.16001586211293
130.5409511975122,126.87080209871046,121.72006817019587
129.27865975228482,126.85412706487041,122.07964021959832
127.68255537687806,126.516444145041,122.2518335343459
125.92898676471277,125.93150205866118,122.26397753477707
124.19918786337472,125.18980034466652,122.15509271520004
122.66800277469706,124.39206209504869,121.9729884210673
121.49422604547935,123.64272073676229,121.77110871863705
120.81196235036562,123.04339419724455,121.60513202160142
120.72241993610164,122.68624289872014,121.52928938488516
121.28594722651424,122.64720845709432,121.59241170077475
122.51476018956932,122.97937669403505,121.83383844469651
124.3674708609567,123.70702176684883,122.27948514177044
126.74697821540099,124.82116050362607,122.93852141195036
129.5033313462492,126.27757151852889,123.80120114023575
132.44273182319031,127.99813741260654,124.83836768572408
135.34294646502107,129.87602860347457,126.00301111879254
137.9742186094954,131.78470493132735,127.23399338876766
140.12355045260327,133.59006338954046,128.46172344234276
141.619267087984,135.1644400994269,129.6152217935144
142.35231222129144,136.40072044063825,130.62973470025668
142.29091393695515,137.2246342874446,131.45390489082996
141.48610487842447,137.60347035514724,132.05551788158235
140.06694707154648,137.54992194123912,132.42502599416864
138.22594097035088,137.12049434505636,132.57637619229655
136.1966718318972,136.408728517904,132.54507314677466
134.2269530937761,135.53426953213685,132.3838190375432
132.55133261814115,134.62938697995605,132.15640993963805
131.3667293962986,133.82483497604997,131.93077515485058
130.81421235028907,133.23688401636713,131.77208966223768
1 jaw teeth lips
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 103.1558507984203 105.79078781985666 107.03252484838644
16 101.40633091517769 104.66457400969036 106.38072244126543
17 100.12134766492898 103.6484036032248 105.75005520720586
18 99.45126641946796 102.85736079255639 105.20441583015872
19 99.48179732233366 102.38386055477191 104.80001892286633
20 100.23050496668327 102.29015479771627 104.58058330376035
21 101.65091352849612 102.60466563405991 104.57423668578618
22 103.64240261318041 103.32191065527263 104.79217554984066
23 106.06357089840077 104.40533877149676 105.22887068691215
24 108.74678086098042 105.79217620216004 105.86346569399983
25 111.51210232882211 107.39940035392367 106.66198566332166
26 114.17965210558982 109.13016482609532 107.58004037730764
27 116.58013494644592 110.88029851210429 108.56583039522552
28 118.5639933186376 112.54478587652095 109.56339322863947
29 120.0098081380237 114.02430757656022 110.51611069636495
30 120.83241224927542 115.2319237044486 111.37050425175165
31 120.99065964425567 116.09981380870111 112.08026497907055
32 120.49411603245278 116.5857016658648 112.61031953834029
33 119.4073343437952 116.67828299452412 112.94056606892171
34 117.85007687184077 116.40075141358238 113.068780058851
35 115.99199777822656 115.81147829607036 113.01214145400436
36 114.04094344984783 115.0011006527875 112.80690526393907
37 112.22506977279107 114.08570376220037 112.50593506070611
38 110.77020629693173 113.19638598834503 112.17411679531374
39 109.87504142164983 112.46614680016516 111.88201642929747
40 109.68748175918653 112.01560617646442 111.69846971536622
41 110.2857400647586 111.93941339066988 111.6830259268331
42 111.66723663953537 112.29524430472975 111.87925477413708
43 113.74731238301733 113.09698995690853 112.30984113812596
44 116.3682399561194 114.31314783482495 112.97414499271152
45 119.3173733891288 115.87064675201391 113.84853751145694
46 122.35182077950905 117.66351372462186 114.88940737208642
47 125.22604604819371 119.5650827047563 116.03834231590618
48 127.71848843366506 121.44198134759222 117.22870166509915
49 129.65367446726884 123.16799066000424 118.39265487005467
50 130.91727906545398 124.63606174597852 119.46778582660964
51 131.46294056512707 125.76723343433491 120.40253423645706
52 131.3110527086312 126.51581108594984 121.16001586211293
53 130.5409511975122 126.87080209871046 121.72006817019587
54 129.27865975228482 126.85412706487041 122.07964021959832
55 127.68255537687806 126.516444145041 122.2518335343459
56 125.92898676471277 125.93150205866118 122.26397753477707
57 124.19918786337472 125.18980034466652 122.15509271520004
58 122.66800277469706 124.39206209504869 121.9729884210673
59 121.49422604547935 123.64272073676229 121.77110871863705
60 120.81196235036562 123.04339419724455 121.60513202160142
61 120.72241993610164 122.68624289872014 121.52928938488516
62 121.28594722651424 122.64720845709432 121.59241170077475
63 122.51476018956932 122.97937669403505 121.83383844469651
64 124.3674708609567 123.70702176684883 122.27948514177044
65 126.74697821540099 124.82116050362607 122.93852141195036
66 129.5033313462492 126.27757151852889 123.80120114023575
67 132.44273182319031 127.99813741260654 124.83836768572408
68 135.34294646502107 129.87602860347457 126.00301111879254
69 137.9742186094954 131.78470493132735 127.23399338876766
70 140.12355045260327 133.59006338954046 128.46172344234276
71 141.619267087984 135.1644400994269 129.6152217935144
72 142.35231222129144 136.40072044063825 130.62973470025668
73 142.29091393695515 137.2246342874446 131.45390489082996
74 141.48610487842447 137.60347035514724 132.05551788158235
75 140.06694707154648 137.54992194123912 132.42502599416864
76 138.22594097035088 137.12049434505636 132.57637619229655
77 136.1966718318972 136.408728517904 132.54507314677466
78 134.2269530937761 135.53426953213685 132.3838190375432
79 132.55133261814115 134.62938697995605 132.15640993963805
80 131.3667293962986 133.82483497604997 131.93077515485058
81 130.81421235028907 133.23688401636713 131.77208966223768