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 @@
pp,r1,r2,s1,s2
99.75,101.5,102.75,98.5,96.75
103.2358064261408,105.21610219117743,106.75760667526887,101.69430194204935,99.71400617701272
106.51134915748332,108.40930075187866,110.03710119333992,104.88354871602206,102.98559712162672
109.31558479585792,110.80024238043313,112.24953136417449,107.86629581211656,106.38163822754134
111.42442756880905,112.6959583530238,114.1755625555121,109.94482336632075,108.673292582106
112.67523576992727,114.0509132876588,115.82716261316382,110.89898644442225,109.52330892669072
112.98597443293207,114.66926044328898,116.84754270194611,110.80769217427493,109.12440616391802
112.36620783831144,114.0915483164463,116.28511713822658,110.17263901653116,108.4472985383963
110.9180427107274,112.39708693487947,114.20295296946335,109.11217667614352,107.63313245199146
108.82649775219599,109.88760365229585,111.05410745211113,107.65999395238072,106.59888805228086
106.34028453423286,107.88152447268968,109.28093331841488,104.94087568850766,103.39963575005085
103.74537561499469,105.77096206265162,107.44221362316294,102.07412405448336,100.04853760682643
101.3347529953889,103.48218016442083,105.14952219012756,99.66741096968217,97.51998380065024
99.37819150172825,101.27018140219896,102.67387748980565,97.97449541412156,96.08250551365086
98.09576671227829,99.84443296766173,101.21614809587352,96.7240515840665,94.97538532868306
97.63803999389027,99.33786436225238,100.86437107169697,96.11153328444568,94.41170891608358
98.07472892009375,99.60069279312157,101.1994066830537,96.47601503016162,94.9500511571338
99.39235615239389,100.85192768418362,102.61250516731575,97.63177866926176,96.17220713747203
101.5001376899113,102.74473177899304,104.44489099901712,99.79997846988722,98.55538438080548
104.24243761307272,105.82651553322012,107.90917953146571,102.15977361482713,100.57569569467974
107.41561290027985,109.1206844603964,111.24529178505117,105.29100557562509,103.58593401550854
110.78702323684249,112.32878088441295,114.10830699598142,109.00749712527401,107.46573947770355
114.11430721063675,115.26918566250063,116.4218512653705,112.96164160776688,111.806763155903
117.16357145419374,118.7170857318505,120.02894763013074,115.8517095559135,114.29819527825674
119.7257151488084,121.80238913464852,123.45713614112239,118.07096814233454,115.99429415649442
121.63055019795274,123.86671191007076,125.60397448259948,119.89328762542402,117.657125913306
122.75857175838351,124.7415732556743,126.27085136223998,121.22929365181783,119.24629215452704
123.05016794262339,124.52156978400922,125.6955112937401,121.87622643289251,120.40482459150668
122.51180477633085,123.95533950002078,125.3305056146068,121.13663866174483,119.69310393805489
121.21842336751901,122.80353763713414,124.56611404014362,119.45584696450953,117.8707326948944
119.31110683063227,120.919356628115,122.90745038202715,117.32301307672012,115.71476327923739
116.98915760077536,118.37729729214395,120.25466371492199,115.11179117799732,113.72365148662873
114.49614705785103,115.93433976949258,117.85136222129584,112.57912460604777,111.14093189440622
112.10024032662247,113.72343327490799,115.69782475194486,110.1258488495856,108.50265590130007
110.07004395857749,111.62473401596233,113.31700574237296,108.37777223216686,106.82308217478202
108.64818240948043,110.10844114682158,111.458979902557,107.297643653745,105.83738491640385
108.02555852227405,109.55440008971985,110.75308330304362,106.82687530895028,105.29803374150448
108.31959289452305,110.37131889896037,111.95328245652354,106.73762933695988,104.68590333252257
109.55953858880657,111.7983894393855,113.54288798087109,107.81504004732099,105.57618919674206
111.68121041835619,113.69173559601434,115.30435328876551,110.06859272560501,108.05806754794686
114.5322503045423,115.97376474505627,117.21123815466355,113.29477689493503,111.85326245442106
117.88757297816161,119.11392764460153,120.3800640946807,116.62143652808244,115.39508186164252
121.47316278726743,123.06137240642857,124.92344665570188,119.61108853799412,118.02287891883297
124.99519232326226,126.69948832121449,128.8446801829374,122.85000046153937,121.14570446358714
128.1707253536709,129.7095730824924,131.74840122451127,126.13189721165205,124.59304948283052
130.7561704255396,132.01648381340888,133.7134495213249,129.0592047176236,127.79889132975433
132.57016494952438,134.0564579331979,135.80916742703812,130.81745545568415,129.33116247201065
133.50857021097778,135.0221674988538,136.56671743372704,131.96402027610455,130.45042298822852
133.55053301365854,135.2775503964245,136.79247827552194,132.03560513456108,130.30858775179513
132.75586593795128,134.48801422480747,135.81695776470755,131.4269223980512,129.69477411119502
131.2550776986053,133.212571142251,134.67446317996493,129.79318566089137,127.83569221724568
129.23407695329016,131.38889662325485,133.0770587371876,127.54591483935741,125.39109516939271
126.91580669241227,128.88265629639562,130.52604623921468,125.27241674959325,123.30556714560988
124.54088040616134,125.97443635807687,127.3069247497988,123.20839201443941,121.77483606252387
122.34881483819879,123.47220808887849,124.74167074392513,121.07935218315215,119.95595893247246
120.56086831850368,122.09857735708441,123.99372988005499,118.6657157955331,117.12800675695237
119.36498113076334,121.10441130679563,123.32514441598471,117.14424802157426,115.40481784554197
118.90301126811374,120.5506592888774,122.68562994750138,116.76804060948976,115.1203925887261
119.26042057771592,120.56662839601262,122.24686497915383,117.58018399457471,116.27397617627801
120.45875530483092,121.76499347299884,123.24039124665228,118.98335753117748,117.67711936300955
122.45156466981135,124.02551403118485,125.52233766761456,120.95474103338164,119.38079167200813
125.1246501097061,127.06077807176187,128.69237804576446,123.49305013570351,121.55692217364773
128.30157779318262,130.2626065463162,131.76626412054748,126.7979202189513,124.83689146581774
131.7551099011788,133.56117646326018,134.86900907156303,130.44727729287595,128.64121073079457
135.2245934480723,137.21504933714863,138.78839354597167,133.65124923924927,131.66079335017295
138.43846573713427,140.2885600535255,141.90478844979313,136.82223734086662,134.9721430244754
141.1400565618768,142.54235180704387,143.95128542582248,139.7311229430982,138.32882769793113
143.1140042174615,144.34777490454061,145.8270629535848,141.63471616841733,140.40094548133823
144.21007157012286,145.6513768660649,147.51696729939925,142.34448113678852,140.90317584084647
144.36111380188333,146.07225900794367,148.2825773277284,142.1507954820986,140.43965027603826
143.59247943663343,145.29527881428604,147.44992429448442,141.43783395643504,139.73503457878243
142.0211716648925,143.43602898414937,145.1447777101864,140.3124229388555,138.89756561959862
139.84449583895628,140.94354287518595,142.1065717562293,138.68146695791293,137.58241992168325
137.31942780989448,138.96230317160737,140.42358582911223,135.85814515238962,134.21526979067673
134.73528228094608,136.80901381844578,138.50003832997277,133.0442577694191,130.9705262319194
132.38319421519236,134.512228809292,136.1511420829866,130.74428094149775,128.6152463473981
130.52628402854575,132.34538845178253,133.68695605299564,129.18471642733263,127.36561200409585
129.3741089943372,131.1327632752579,132.54338290124667,127.96348936834846,126.20483508742775
129.06418368570354,130.7288919142122,132.26027867654088,127.53279692337486,125.8680886948662
129.6521615246492,131.18346010512911,132.8287921528506,128.0068294769277,126.47553089644776
1 pp r1 r2 s1 s2
2 99.75 101.5 102.75 98.5 96.75
3 103.2358064261408 105.21610219117743 106.75760667526887 101.69430194204935 99.71400617701272
4 106.51134915748332 108.40930075187866 110.03710119333992 104.88354871602206 102.98559712162672
5 109.31558479585792 110.80024238043313 112.24953136417449 107.86629581211656 106.38163822754134
6 111.42442756880905 112.6959583530238 114.1755625555121 109.94482336632075 108.673292582106
7 112.67523576992727 114.0509132876588 115.82716261316382 110.89898644442225 109.52330892669072
8 112.98597443293207 114.66926044328898 116.84754270194611 110.80769217427493 109.12440616391802
9 112.36620783831144 114.0915483164463 116.28511713822658 110.17263901653116 108.4472985383963
10 110.9180427107274 112.39708693487947 114.20295296946335 109.11217667614352 107.63313245199146
11 108.82649775219599 109.88760365229585 111.05410745211113 107.65999395238072 106.59888805228086
12 106.34028453423286 107.88152447268968 109.28093331841488 104.94087568850766 103.39963575005085
13 103.74537561499469 105.77096206265162 107.44221362316294 102.07412405448336 100.04853760682643
14 101.3347529953889 103.48218016442083 105.14952219012756 99.66741096968217 97.51998380065024
15 99.37819150172825 101.27018140219896 102.67387748980565 97.97449541412156 96.08250551365086
16 98.09576671227829 99.84443296766173 101.21614809587352 96.7240515840665 94.97538532868306
17 97.63803999389027 99.33786436225238 100.86437107169697 96.11153328444568 94.41170891608358
18 98.07472892009375 99.60069279312157 101.1994066830537 96.47601503016162 94.9500511571338
19 99.39235615239389 100.85192768418362 102.61250516731575 97.63177866926176 96.17220713747203
20 101.5001376899113 102.74473177899304 104.44489099901712 99.79997846988722 98.55538438080548
21 104.24243761307272 105.82651553322012 107.90917953146571 102.15977361482713 100.57569569467974
22 107.41561290027985 109.1206844603964 111.24529178505117 105.29100557562509 103.58593401550854
23 110.78702323684249 112.32878088441295 114.10830699598142 109.00749712527401 107.46573947770355
24 114.11430721063675 115.26918566250063 116.4218512653705 112.96164160776688 111.806763155903
25 117.16357145419374 118.7170857318505 120.02894763013074 115.8517095559135 114.29819527825674
26 119.7257151488084 121.80238913464852 123.45713614112239 118.07096814233454 115.99429415649442
27 121.63055019795274 123.86671191007076 125.60397448259948 119.89328762542402 117.657125913306
28 122.75857175838351 124.7415732556743 126.27085136223998 121.22929365181783 119.24629215452704
29 123.05016794262339 124.52156978400922 125.6955112937401 121.87622643289251 120.40482459150668
30 122.51180477633085 123.95533950002078 125.3305056146068 121.13663866174483 119.69310393805489
31 121.21842336751901 122.80353763713414 124.56611404014362 119.45584696450953 117.8707326948944
32 119.31110683063227 120.919356628115 122.90745038202715 117.32301307672012 115.71476327923739
33 116.98915760077536 118.37729729214395 120.25466371492199 115.11179117799732 113.72365148662873
34 114.49614705785103 115.93433976949258 117.85136222129584 112.57912460604777 111.14093189440622
35 112.10024032662247 113.72343327490799 115.69782475194486 110.1258488495856 108.50265590130007
36 110.07004395857749 111.62473401596233 113.31700574237296 108.37777223216686 106.82308217478202
37 108.64818240948043 110.10844114682158 111.458979902557 107.297643653745 105.83738491640385
38 108.02555852227405 109.55440008971985 110.75308330304362 106.82687530895028 105.29803374150448
39 108.31959289452305 110.37131889896037 111.95328245652354 106.73762933695988 104.68590333252257
40 109.55953858880657 111.7983894393855 113.54288798087109 107.81504004732099 105.57618919674206
41 111.68121041835619 113.69173559601434 115.30435328876551 110.06859272560501 108.05806754794686
42 114.5322503045423 115.97376474505627 117.21123815466355 113.29477689493503 111.85326245442106
43 117.88757297816161 119.11392764460153 120.3800640946807 116.62143652808244 115.39508186164252
44 121.47316278726743 123.06137240642857 124.92344665570188 119.61108853799412 118.02287891883297
45 124.99519232326226 126.69948832121449 128.8446801829374 122.85000046153937 121.14570446358714
46 128.1707253536709 129.7095730824924 131.74840122451127 126.13189721165205 124.59304948283052
47 130.7561704255396 132.01648381340888 133.7134495213249 129.0592047176236 127.79889132975433
48 132.57016494952438 134.0564579331979 135.80916742703812 130.81745545568415 129.33116247201065
49 133.50857021097778 135.0221674988538 136.56671743372704 131.96402027610455 130.45042298822852
50 133.55053301365854 135.2775503964245 136.79247827552194 132.03560513456108 130.30858775179513
51 132.75586593795128 134.48801422480747 135.81695776470755 131.4269223980512 129.69477411119502
52 131.2550776986053 133.212571142251 134.67446317996493 129.79318566089137 127.83569221724568
53 129.23407695329016 131.38889662325485 133.0770587371876 127.54591483935741 125.39109516939271
54 126.91580669241227 128.88265629639562 130.52604623921468 125.27241674959325 123.30556714560988
55 124.54088040616134 125.97443635807687 127.3069247497988 123.20839201443941 121.77483606252387
56 122.34881483819879 123.47220808887849 124.74167074392513 121.07935218315215 119.95595893247246
57 120.56086831850368 122.09857735708441 123.99372988005499 118.6657157955331 117.12800675695237
58 119.36498113076334 121.10441130679563 123.32514441598471 117.14424802157426 115.40481784554197
59 118.90301126811374 120.5506592888774 122.68562994750138 116.76804060948976 115.1203925887261
60 119.26042057771592 120.56662839601262 122.24686497915383 117.58018399457471 116.27397617627801
61 120.45875530483092 121.76499347299884 123.24039124665228 118.98335753117748 117.67711936300955
62 122.45156466981135 124.02551403118485 125.52233766761456 120.95474103338164 119.38079167200813
63 125.1246501097061 127.06077807176187 128.69237804576446 123.49305013570351 121.55692217364773
64 128.30157779318262 130.2626065463162 131.76626412054748 126.7979202189513 124.83689146581774
65 131.7551099011788 133.56117646326018 134.86900907156303 130.44727729287595 128.64121073079457
66 135.2245934480723 137.21504933714863 138.78839354597167 133.65124923924927 131.66079335017295
67 138.43846573713427 140.2885600535255 141.90478844979313 136.82223734086662 134.9721430244754
68 141.1400565618768 142.54235180704387 143.95128542582248 139.7311229430982 138.32882769793113
69 143.1140042174615 144.34777490454061 145.8270629535848 141.63471616841733 140.40094548133823
70 144.21007157012286 145.6513768660649 147.51696729939925 142.34448113678852 140.90317584084647
71 144.36111380188333 146.07225900794367 148.2825773277284 142.1507954820986 140.43965027603826
72 143.59247943663343 145.29527881428604 147.44992429448442 141.43783395643504 139.73503457878243
73 142.0211716648925 143.43602898414937 145.1447777101864 140.3124229388555 138.89756561959862
74 139.84449583895628 140.94354287518595 142.1065717562293 138.68146695791293 137.58241992168325
75 137.31942780989448 138.96230317160737 140.42358582911223 135.85814515238962 134.21526979067673
76 134.73528228094608 136.80901381844578 138.50003832997277 133.0442577694191 130.9705262319194
77 132.38319421519236 134.512228809292 136.1511420829866 130.74428094149775 128.6152463473981
78 130.52628402854575 132.34538845178253 133.68695605299564 129.18471642733263 127.36561200409585
79 129.3741089943372 131.1327632752579 132.54338290124667 127.96348936834846 126.20483508742775
80 129.06418368570354 130.7288919142122 132.26027867654088 127.53279692337486 125.8680886948662
81 129.6521615246492 131.18346010512911 132.8287921528506 128.0068294769277 126.47553089644776