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 @@
arc_382,arc_500,arc_618
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
103.09892555931879,105.31087260692951,107.52281965454023
102.86253302957594,105.00145830098337,107.14038357239079
102.51732940859611,104.54962110074798,106.58191279289986
102.04488957552375,103.93124435588888,105.81759913625402
101.41236918521201,103.10333808584734,104.79430698648267
100.55442722822669,101.98037740916497,103.40632759010326
99.3028290994984,100.34215996318552,101.38149082687266
95.93821562552817,95.93821562552817,95.93821562552817
95.93821562552817,95.93821562552817,95.93821562552817
95.93821562552817,95.93821562552817,95.93821562552817
95.93821562552817,95.93821562552817,95.93821562552817
95.93821562552817,95.93821562552817,95.93821562552817
95.93821562552817,95.93821562552817,95.93821562552817
114.1996706830759,111.08342685202602,107.96718302097617
114.64170556553591,111.66200654110982,108.68230751668372
115.2111578240943,112.40736290047943,109.60356797686457
115.93404385308685,113.35354880230214,110.77305375151744
116.85499649070387,114.55898419185321,112.26297189300257
118.06129049382565,116.13790304410686,114.21451559438808
119.7762789809758,118.38265237283744,116.98902576469906
124.2878498649492,124.2878498649492,124.2878498649492
124.2878498649492,124.2878498649492,124.2878498649492
113.03676512629407,115.12768133538461,117.21859754447513
112.89055138026127,114.93630208665057,116.98205279303987
112.68025357449474,114.66104317857919,116.64183278266366
112.39928130554219,114.29327842864129,116.1872755517404
112.03731825806305,113.8195048062864,115.60169135450975
111.57782753500113,113.21807715829961,114.85832678159808
110.99243900016643,112.45186179856832,113.9112845969702
110.22567787671223,111.44824776263349,112.67081764855476
109.13557339495634,110.02140943572789,110.90724547649944
106.26786689008574,106.26786689008574,106.26786689008574
106.26786689008574,106.26786689008574,106.26786689008574
106.26786689008574,106.26786689008574,106.26786689008574
124.48180055179492,121.2125023312886,117.9432041107823
124.81787583214145,121.65239144168983,118.48690705123822
125.2668954199286,122.24011341523324,119.21333141053788
125.84534573810114,122.99724733954284,120.14914894098453
126.5796542726424,123.95838416485861,121.33711405707484
127.5151591165428,125.18286694483298,122.85057477312316
128.74051407725875,126.78673469446117,124.8329553116636
130.4826015326069,129.06695387685406,127.6513062211012
135.065460892756,135.065460892756,135.065460892756
123.66972430432146,125.65112379312414,127.63252328192682
123.34994395140984,125.23256312177384,127.11518229213785
122.91229797272464,124.65972807113877,126.4071581695529
122.32636091602875,123.89279475085618,125.45922858568362
121.53160395199767,122.85253694453279,124.1734699370679
120.37218247729751,121.33496956927081,122.2977566612441
117.25536324735009,117.25536324735009,117.25536324735009
117.25536324735009,117.25536324735009,117.25536324735009
117.25536324735009,117.25536324735009,117.25536324735009
117.25536324735009,117.25536324735009,117.25536324735009
117.25536324735009,117.25536324735009,117.25536324735009
117.25536324735009,117.25536324735009,117.25536324735009
135.72830037838702,132.37885130585516,129.02940223332334
136.01316038869857,132.75170472249332,129.4902490562881
136.3911144324333,133.2464089682194,130.10170350400554
136.87304025488316,133.87720192954126,130.88136360419932
137.47544885260135,134.66569485849172,131.8559408643821
138.22438541387888,135.64597831566127,133.06757121744369
139.1641629801871,136.87605366423224,134.58794434827738
140.38109660506578,138.46889872297396,136.55670084088214
1 arc_382 arc_500 arc_618
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 103.09892555931879 105.31087260692951 107.52281965454023
20 102.86253302957594 105.00145830098337 107.14038357239079
21 102.51732940859611 104.54962110074798 106.58191279289986
22 102.04488957552375 103.93124435588888 105.81759913625402
23 101.41236918521201 103.10333808584734 104.79430698648267
24 100.55442722822669 101.98037740916497 103.40632759010326
25 99.3028290994984 100.34215996318552 101.38149082687266
26 95.93821562552817 95.93821562552817 95.93821562552817
27 95.93821562552817 95.93821562552817 95.93821562552817
28 95.93821562552817 95.93821562552817 95.93821562552817
29 95.93821562552817 95.93821562552817 95.93821562552817
30 95.93821562552817 95.93821562552817 95.93821562552817
31 95.93821562552817 95.93821562552817 95.93821562552817
32 114.1996706830759 111.08342685202602 107.96718302097617
33 114.64170556553591 111.66200654110982 108.68230751668372
34 115.2111578240943 112.40736290047943 109.60356797686457
35 115.93404385308685 113.35354880230214 110.77305375151744
36 116.85499649070387 114.55898419185321 112.26297189300257
37 118.06129049382565 116.13790304410686 114.21451559438808
38 119.7762789809758 118.38265237283744 116.98902576469906
39 124.2878498649492 124.2878498649492 124.2878498649492
40 124.2878498649492 124.2878498649492 124.2878498649492
41 113.03676512629407 115.12768133538461 117.21859754447513
42 112.89055138026127 114.93630208665057 116.98205279303987
43 112.68025357449474 114.66104317857919 116.64183278266366
44 112.39928130554219 114.29327842864129 116.1872755517404
45 112.03731825806305 113.8195048062864 115.60169135450975
46 111.57782753500113 113.21807715829961 114.85832678159808
47 110.99243900016643 112.45186179856832 113.9112845969702
48 110.22567787671223 111.44824776263349 112.67081764855476
49 109.13557339495634 110.02140943572789 110.90724547649944
50 106.26786689008574 106.26786689008574 106.26786689008574
51 106.26786689008574 106.26786689008574 106.26786689008574
52 106.26786689008574 106.26786689008574 106.26786689008574
53 124.48180055179492 121.2125023312886 117.9432041107823
54 124.81787583214145 121.65239144168983 118.48690705123822
55 125.2668954199286 122.24011341523324 119.21333141053788
56 125.84534573810114 122.99724733954284 120.14914894098453
57 126.5796542726424 123.95838416485861 121.33711405707484
58 127.5151591165428 125.18286694483298 122.85057477312316
59 128.74051407725875 126.78673469446117 124.8329553116636
60 130.4826015326069 129.06695387685406 127.6513062211012
61 135.065460892756 135.065460892756 135.065460892756
62 123.66972430432146 125.65112379312414 127.63252328192682
63 123.34994395140984 125.23256312177384 127.11518229213785
64 122.91229797272464 124.65972807113877 126.4071581695529
65 122.32636091602875 123.89279475085618 125.45922858568362
66 121.53160395199767 122.85253694453279 124.1734699370679
67 120.37218247729751 121.33496956927081 122.2977566612441
68 117.25536324735009 117.25536324735009 117.25536324735009
69 117.25536324735009 117.25536324735009 117.25536324735009
70 117.25536324735009 117.25536324735009 117.25536324735009
71 117.25536324735009 117.25536324735009 117.25536324735009
72 117.25536324735009 117.25536324735009 117.25536324735009
73 117.25536324735009 117.25536324735009 117.25536324735009
74 135.72830037838702 132.37885130585516 129.02940223332334
75 136.01316038869857 132.75170472249332 129.4902490562881
76 136.3911144324333 133.2464089682194 130.10170350400554
77 136.87304025488316 133.87720192954126 130.88136360419932
78 137.47544885260135 134.66569485849172 131.8559408643821
79 138.22438541387888 135.64597831566127 133.06757121744369
80 139.1641629801871 136.87605366423224 134.58794434827738
81 140.38109660506578 138.46889872297396 136.55670084088214