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 @@
poc,vah,val
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
99.54309832541462,109.15611885844513,96.33875814773778
99.54309832541462,109.95720390286434,97.13984319215699
111.55937399170276,114.7637141693796,101.94635345867225
111.64283084076067,114.86429037209041,101.97845224677144
111.43255281280342,115.18875576729438,101.10299468795326
99.64854324445065,111.30957290392128,96.46826242823138
98.79546532812748,111.3673640195644,96.50966556604803
98.89130252546786,113.06611964517838,96.5288330055161
98.89130252546786,113.06611964517838,96.5288330055161
98.89130252546786,115.42858916513012,96.5288330055161
121.3347629650095,123.69723248496126,101.25377204541961
121.3347629650095,123.69723248496126,101.25377204541961
121.3347629650095,123.69723248496126,101.25377204541961
121.3347629650095,123.69723248496126,103.61624156537137
121.3347629650095,123.69723248496126,105.97871108532311
121.3347629650095,123.69723248496126,109.52241536525075
121.39836186308636,123.70995226457663,109.84040985563499
121.54253056866325,123.738786005692,109.46312566500511
121.7844846291034,123.78717681778004,109.76833149704358
109.41757537168279,120.23232045769473,106.7138891001798
109.19378668856066,120.03054999468576,106.87162312296242
121.65993568111494,123.91243355297287,111.14827894577793
121.65993568111494,123.91243355297287,111.89911156973056
121.65993568111494,123.91243355297287,111.89911156973056
121.48741075094989,124.09647541281232,111.05115210350019
121.73020615620499,124.72291698190548,110.75693312863649
123.17918660976211,124.27023949490253,110.08655198807718
109.19026351021895,122.04880863880511,106.85234621411239
109.26633077089463,122.45957184645371,106.86755966624752
109.2676162653639,123.66641326669901,106.86781676514137
109.2676162653639,126.06621276692154,106.86781676514137
132.06571151747784,134.46551101770035,111.66741576558641
132.06571151747784,134.46551101770035,111.66741576558641
132.06571151747784,134.46551101770035,111.66741576558641
132.06571151747784,134.46551101770035,112.86731551569767
132.06571151747784,134.46551101770035,115.2671150159202
132.06571151747784,134.46551101770035,118.86681426625398
132.06571151747784,134.46551101770035,120.06671401636524
132.17538035582595,134.48744478536997,120.61505820810581
132.4201717623333,134.53640306667145,120.78089958847339
120.87345097836938,130.94519994986956,117.21099680691476
120.87885723654206,130.08097852705922,117.81148347303635
121.3368439577556,129.49980537856663,117.62640694829605
131.7260675842424,133.9523297899181,122.07893135964753
131.7260675842424,133.9523297899181,122.07893135964753
120.91959594913983,131.5051570876435,119.29104808167772
132.9299032315107,134.82984747201505,121.53023778848481
120.94401717512378,131.48302839733432,117.78231380846061
121.24214456264362,131.49386794482697,117.82490343524917
121.45832348261571,132.26593551615588,117.85578613810232
121.53062329152147,132.5241491193907,117.86611468223171
121.53062329152147,136.18865772868045,117.86611468223171
121.53062329152147,139.8531663379702,117.86611468223171
121.53062329152147,141.07466920773345,117.86611468223171
121.53062329152147,141.07466920773345,117.86611468223171
142.2961720774967,145.96068068678645,122.7521261612847
142.2961720774967,145.96068068678645,126.41663477057446
142.2961720774967,145.96068068678645,128.85964051010095
142.3980876313401,145.9752400516212,130.47424623040308
142.5728403530215,146.00020472614713,130.00583765156082
129.97750876312355,142.82441716973867,127.83635736202103
1 poc vah val
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 99.54309832541462 109.15611885844513 96.33875814773778
22 99.54309832541462 109.95720390286434 97.13984319215699
23 111.55937399170276 114.7637141693796 101.94635345867225
24 111.64283084076067 114.86429037209041 101.97845224677144
25 111.43255281280342 115.18875576729438 101.10299468795326
26 99.64854324445065 111.30957290392128 96.46826242823138
27 98.79546532812748 111.3673640195644 96.50966556604803
28 98.89130252546786 113.06611964517838 96.5288330055161
29 98.89130252546786 113.06611964517838 96.5288330055161
30 98.89130252546786 115.42858916513012 96.5288330055161
31 121.3347629650095 123.69723248496126 101.25377204541961
32 121.3347629650095 123.69723248496126 101.25377204541961
33 121.3347629650095 123.69723248496126 101.25377204541961
34 121.3347629650095 123.69723248496126 103.61624156537137
35 121.3347629650095 123.69723248496126 105.97871108532311
36 121.3347629650095 123.69723248496126 109.52241536525075
37 121.39836186308636 123.70995226457663 109.84040985563499
38 121.54253056866325 123.738786005692 109.46312566500511
39 121.7844846291034 123.78717681778004 109.76833149704358
40 109.41757537168279 120.23232045769473 106.7138891001798
41 109.19378668856066 120.03054999468576 106.87162312296242
42 121.65993568111494 123.91243355297287 111.14827894577793
43 121.65993568111494 123.91243355297287 111.89911156973056
44 121.65993568111494 123.91243355297287 111.89911156973056
45 121.48741075094989 124.09647541281232 111.05115210350019
46 121.73020615620499 124.72291698190548 110.75693312863649
47 123.17918660976211 124.27023949490253 110.08655198807718
48 109.19026351021895 122.04880863880511 106.85234621411239
49 109.26633077089463 122.45957184645371 106.86755966624752
50 109.2676162653639 123.66641326669901 106.86781676514137
51 109.2676162653639 126.06621276692154 106.86781676514137
52 132.06571151747784 134.46551101770035 111.66741576558641
53 132.06571151747784 134.46551101770035 111.66741576558641
54 132.06571151747784 134.46551101770035 111.66741576558641
55 132.06571151747784 134.46551101770035 112.86731551569767
56 132.06571151747784 134.46551101770035 115.2671150159202
57 132.06571151747784 134.46551101770035 118.86681426625398
58 132.06571151747784 134.46551101770035 120.06671401636524
59 132.17538035582595 134.48744478536997 120.61505820810581
60 132.4201717623333 134.53640306667145 120.78089958847339
61 120.87345097836938 130.94519994986956 117.21099680691476
62 120.87885723654206 130.08097852705922 117.81148347303635
63 121.3368439577556 129.49980537856663 117.62640694829605
64 131.7260675842424 133.9523297899181 122.07893135964753
65 131.7260675842424 133.9523297899181 122.07893135964753
66 120.91959594913983 131.5051570876435 119.29104808167772
67 132.9299032315107 134.82984747201505 121.53023778848481
68 120.94401717512378 131.48302839733432 117.78231380846061
69 121.24214456264362 131.49386794482697 117.82490343524917
70 121.45832348261571 132.26593551615588 117.85578613810232
71 121.53062329152147 132.5241491193907 117.86611468223171
72 121.53062329152147 136.18865772868045 117.86611468223171
73 121.53062329152147 139.8531663379702 117.86611468223171
74 121.53062329152147 141.07466920773345 117.86611468223171
75 121.53062329152147 141.07466920773345 117.86611468223171
76 142.2961720774967 145.96068068678645 122.7521261612847
77 142.2961720774967 145.96068068678645 126.41663477057446
78 142.2961720774967 145.96068068678645 128.85964051010095
79 142.3980876313401 145.9752400516212 130.47424623040308
80 142.5728403530215 146.00020472614713 130.00583765156082
81 129.97750876312355 142.82441716973867 127.83635736202103