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 @@
tenkan,kijun,senkou_a,senkou_b,chikou
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
106.5821283457946,nan,nan,nan,nan
108.20988367634669,nan,nan,nan,nan
109.8888271273386,nan,nan,nan,nan
108.44202292946348,nan,nan,nan,nan
107.17579125897308,nan,nan,nan,nan
106.32522914642337,nan,nan,nan,nan
105.75567857424203,nan,nan,nan,nan
105.24899614280994,nan,nan,nan,nan
104.33106218541974,nan,nan,nan,nan
102.96560858876973,nan,nan,nan,nan
101.83895450274312,nan,nan,nan,nan
101.13165861842324,nan,nan,nan,nan
102.7392179252314,nan,nan,nan,nan
104.25238248696957,nan,nan,nan,nan
105.6025942195174,nan,nan,nan,nan
107.20682448900108,nan,nan,nan,nan
108.96461360117411,nan,nan,nan,nan
110.6502986955428,109.65301419800483,nan,nan,100
112.27169673288938,110.11303274523868,nan,nan,103.4552020666134
113.47310477893726,110.11303274523868,nan,nan,106.64642473395035
114.99919560255626,110.11303274523868,nan,nan,109.33326909627483
116.76655772711061,110.11303274523868,nan,nan,111.32039085967226
118.62363931186104,110.11303274523868,nan,nan,112.47494986604055
119.94443388717798,110.11303274523868,nan,nan,112.73847630878196
118.67290210557934,110.11303274523868,nan,nan,112.13209366648874
117.38244862164308,110.11303274523868,nan,nan,110.75463180551151
116.40160188307092,110.11303274523868,nan,nan,108.7737988023383
115.70601656224677,110.11303274523868,nan,nan,106.41120008059868
115.19184392287256,110.11303274523868,nan,nan,103.92254305856751
114.62443333030711,110.11303274523868,nan,nan,101.57479556705148
113.78353373731508,110.11303274523868,nan,nan,99.62233840816026
112.56719545681958,110.11303274523868,nan,nan,98.28424227586412
111.34051819987002,110.11303274523868,nan,nan,97.72469882334903
112.71078815916326,110.41830745600757,nan,nan,98.0383539116416
114.80155196331324,111.11031724277667,nan,nan,99.24185317672267
116.70412553753545,113.69796389290735,nan,nan,101.27235512444012
118.23871019288774,116.43395659430753,nan,nan,103.99314457402363
119.36050151177068,119.08183873680946,nan,nan,107.20584501801073
120.82178109079612,120.29537066672518,nan,nan,110.6681390048435
122.36190269327452,120.66049351796838,nan,nan,114.11541363513378
124.07809837839216,120.66666389142087,nan,nan,117.28439764388199
125.86333960223885,120.66666389142087,nan,nan,119.93667863849153
127.47520703043114,120.66666389142087,110.15165644677381,nan,121.87999976774739
129.178178609033,120.66666389142087,111.19236473906403,nan,122.98543345374605
130.00720899059246,120.66666389142087,111.79306876208797,nan,123.19889810845086
129.08639267350088,120.66666389142087,112.55611417389747,nan,122.5459890808828
128.14544124013753,120.66666389142087,113.43979523617465,nan,121.12969230082183
127.04431008633946,120.66666389142087,114.36833602854986,nan,119.12118485241757
126.34550592374353,120.66666389142087,115.02873331620833,nan,116.74454423507063
125.67008636260073,120.66666389142087,114.39296742540901,nan,114.2567321877702
124.98616649183467,120.66666389142087,113.74774068344088,nan,111.92464106224679
124.0888011572865,120.66666389142087,113.2573173141548,nan,110.00125312406458
122.9072799412907,120.66666389142087,112.90952465374272,nan,108.7030424002833
122.00580666552938,120.66666389142087,112.65243833405563,nan,108.19063769933508
123.53029930738201,120.66666389142087,112.3687330377729,nan,108.55447411796011
125.15915287841587,121.19307431549183,111.94828324127688,nan,109.80671474335324
127.02665045212272,123.23431144879669,111.34011410102913,nan,111.88016416080967
128.655028690376,126.57271499871513,110.72677547255435,nan,114.63427081999565
130.25160147003731,129.60510424618855,111.56454780758541,nan,117.86768208634197
131.87290470158433,130.92432775692788,112.95593460304497,nan,121.33623047221137
133.4766386559475,131.66551262540366,115.2010447152214,nan,124.77474439137693
134.87997713465919,131.91339768450908,117.33633339359764,nan,127.92073514707224
136.45599058085855,131.91339768450908,119.22117012429007,nan,130.5378442655162
138.26023773038276,131.91339768450908,120.55857587876065,nan,132.43695669444105
139.90278484033203,131.91339768450908,121.51119810562145,nan,133.49309388747918
141.12399228492484,131.91339768450908,122.3723811349065,nan,133.65657776549278
139.6164914325572,131.91339768450908,123.26500174682985,nan,132.95746831142935
138.4127958713804,131.91339768450908,124.070935460926,nan,131.50287840157117
137.63930586348852,131.91339768450908,124.92242125022693,115.50183825914209,129.46740573130614
137.0934434175423,131.91339768450908,125.33693644100666,115.50183825914209,127.07753652299444
136.57330018701333,131.91339768450908,124.87652828246087,115.50183825914209,124.59141418625812
135.56469792406222,131.91339768450908,124.40605256577919,115.50183825914209,122.27578013601534
1 tenkan kijun senkou_a senkou_b chikou
2 nan nan nan nan nan
3 nan nan nan nan nan
4 nan nan nan nan nan
5 nan nan nan nan nan
6 nan nan nan nan nan
7 nan nan nan nan nan
8 nan nan nan nan nan
9 nan nan nan nan nan
10 106.5821283457946 nan nan nan nan
11 108.20988367634669 nan nan nan nan
12 109.8888271273386 nan nan nan nan
13 108.44202292946348 nan nan nan nan
14 107.17579125897308 nan nan nan nan
15 106.32522914642337 nan nan nan nan
16 105.75567857424203 nan nan nan nan
17 105.24899614280994 nan nan nan nan
18 104.33106218541974 nan nan nan nan
19 102.96560858876973 nan nan nan nan
20 101.83895450274312 nan nan nan nan
21 101.13165861842324 nan nan nan nan
22 102.7392179252314 nan nan nan nan
23 104.25238248696957 nan nan nan nan
24 105.6025942195174 nan nan nan nan
25 107.20682448900108 nan nan nan nan
26 108.96461360117411 nan nan nan nan
27 110.6502986955428 109.65301419800483 nan nan 100
28 112.27169673288938 110.11303274523868 nan nan 103.4552020666134
29 113.47310477893726 110.11303274523868 nan nan 106.64642473395035
30 114.99919560255626 110.11303274523868 nan nan 109.33326909627483
31 116.76655772711061 110.11303274523868 nan nan 111.32039085967226
32 118.62363931186104 110.11303274523868 nan nan 112.47494986604055
33 119.94443388717798 110.11303274523868 nan nan 112.73847630878196
34 118.67290210557934 110.11303274523868 nan nan 112.13209366648874
35 117.38244862164308 110.11303274523868 nan nan 110.75463180551151
36 116.40160188307092 110.11303274523868 nan nan 108.7737988023383
37 115.70601656224677 110.11303274523868 nan nan 106.41120008059868
38 115.19184392287256 110.11303274523868 nan nan 103.92254305856751
39 114.62443333030711 110.11303274523868 nan nan 101.57479556705148
40 113.78353373731508 110.11303274523868 nan nan 99.62233840816026
41 112.56719545681958 110.11303274523868 nan nan 98.28424227586412
42 111.34051819987002 110.11303274523868 nan nan 97.72469882334903
43 112.71078815916326 110.41830745600757 nan nan 98.0383539116416
44 114.80155196331324 111.11031724277667 nan nan 99.24185317672267
45 116.70412553753545 113.69796389290735 nan nan 101.27235512444012
46 118.23871019288774 116.43395659430753 nan nan 103.99314457402363
47 119.36050151177068 119.08183873680946 nan nan 107.20584501801073
48 120.82178109079612 120.29537066672518 nan nan 110.6681390048435
49 122.36190269327452 120.66049351796838 nan nan 114.11541363513378
50 124.07809837839216 120.66666389142087 nan nan 117.28439764388199
51 125.86333960223885 120.66666389142087 nan nan 119.93667863849153
52 127.47520703043114 120.66666389142087 110.15165644677381 nan 121.87999976774739
53 129.178178609033 120.66666389142087 111.19236473906403 nan 122.98543345374605
54 130.00720899059246 120.66666389142087 111.79306876208797 nan 123.19889810845086
55 129.08639267350088 120.66666389142087 112.55611417389747 nan 122.5459890808828
56 128.14544124013753 120.66666389142087 113.43979523617465 nan 121.12969230082183
57 127.04431008633946 120.66666389142087 114.36833602854986 nan 119.12118485241757
58 126.34550592374353 120.66666389142087 115.02873331620833 nan 116.74454423507063
59 125.67008636260073 120.66666389142087 114.39296742540901 nan 114.2567321877702
60 124.98616649183467 120.66666389142087 113.74774068344088 nan 111.92464106224679
61 124.0888011572865 120.66666389142087 113.2573173141548 nan 110.00125312406458
62 122.9072799412907 120.66666389142087 112.90952465374272 nan 108.7030424002833
63 122.00580666552938 120.66666389142087 112.65243833405563 nan 108.19063769933508
64 123.53029930738201 120.66666389142087 112.3687330377729 nan 108.55447411796011
65 125.15915287841587 121.19307431549183 111.94828324127688 nan 109.80671474335324
66 127.02665045212272 123.23431144879669 111.34011410102913 nan 111.88016416080967
67 128.655028690376 126.57271499871513 110.72677547255435 nan 114.63427081999565
68 130.25160147003731 129.60510424618855 111.56454780758541 nan 117.86768208634197
69 131.87290470158433 130.92432775692788 112.95593460304497 nan 121.33623047221137
70 133.4766386559475 131.66551262540366 115.2010447152214 nan 124.77474439137693
71 134.87997713465919 131.91339768450908 117.33633339359764 nan 127.92073514707224
72 136.45599058085855 131.91339768450908 119.22117012429007 nan 130.5378442655162
73 138.26023773038276 131.91339768450908 120.55857587876065 nan 132.43695669444105
74 139.90278484033203 131.91339768450908 121.51119810562145 nan 133.49309388747918
75 141.12399228492484 131.91339768450908 122.3723811349065 nan 133.65657776549278
76 139.6164914325572 131.91339768450908 123.26500174682985 nan 132.95746831142935
77 138.4127958713804 131.91339768450908 124.070935460926 nan 131.50287840157117
78 137.63930586348852 131.91339768450908 124.92242125022693 115.50183825914209 129.46740573130614
79 137.0934434175423 131.91339768450908 125.33693644100666 115.50183825914209 127.07753652299444
80 136.57330018701333 131.91339768450908 124.87652828246087 115.50183825914209 124.59141418625812
81 135.56469792406222 131.91339768450908 124.40605256577919 115.50183825914209 122.27578013601534