Files
wickra/testdata/golden/g_DoubleBollinger.csv
kingchenc 4f708d410d 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
2026-06-15 04:48:51 +02:00

6.0 KiB

1upper_outerupper_innermiddlelower_innerlower_outer
2nannannannannan
3nannannannannan
4nannannannannan
5nannannannannan
6nannannannannan
7nannannannannan
8nannannannannan
9nannannannannan
10nannannannannan
11nannannannannan
12nannannannannan
13nannannannannan
14nannannannannan
15nannannannannan
16nannannannannan
17nannannannannan
18nannannannannan
19nannannannannan
20nannannannannan
21115.28678132658357110.08625971844405104.8857381103045399.68521650216594.4846948940255
22115.44235076607696110.344190563641105.24603036120507100.1478701587691495.04970995633319
23116.031797084579110.81923714634779105.60667720811657100.3941172698853495.18155733165413
24117.04307249142056111.51159957229815105.98012665317574100.4486537340533494.91718081493093
25118.42198305380711112.39983306718162106.37768308055611100.355533093930694.33338310730511
26120.08275668667552113.44562707808629106.80849746949707100.1713678609078593.53423825231862
27121.91875364904577114.5987518068141107.278749964582499.9587481223507192.63874628011904
28123.81164604805659115.8013719349436107.7910978218306299.7808237087176391.77054959560465
29125.64023050374611116.99233427383741108.3444380439287299.6965418140200291.04864558411133
30127.28963390911599118.11181990840664108.934005907697399.7561919069879590.5783779062786
31128.66054775091027119.10617416676587109.5518005826214799.9974269984770790.44305341433265
32129.67757252249928119.93243617185584110.18729982121242100.44216347056990.69702711992556
33130.29572502322122120.56206245162939110.82839988003757101.0947373084457491.36107473685391
34130.50437915457422120.98343793282388111.4624967110735101.9415554893231292.42061426757276
35130.32821912788876121.20291548583329112.07761184377782102.9523082017223593.82700455966688
36129.8251239347045121.24429316044616112.66346238618785104.0826316119295395.5018008376712
37129.08124974424334121.14681465463894113.21237956503455105.2779444754301697.34350938582577
38128.2039061910054120.96194997271232113.71999375441924106.4780375361261599.23608131783307
39127.3130646923414120.74934474691126114.18562480148111107.62190485605096101.05818491062082
40126.53231715555998120.57232996899336114.61234278242675108.65235559586014102.69236840929352
41125.97953405782138120.49311390979372115.00669376176606109.5202736137384104.03385346571073
42125.75638565002856120.56725035094694115.37811505186531110.18897975278368104.99984445370205
43125.9357870598765120.83693963290837115.73809220594023110.6392447789721105.54039735200396
44126.54962545900983121.32437925340197116.09913304779411110.87388684218625105.64864063657839
45127.5832865042029122.02846844468587116.47365038516884110.9188323256518105.36401426613477
46128.98050368815137122.92667844937462116.87285321059787110.81902797182111104.76520273304435
47130.6540678076189123.9799066215526117.3057454354863110.63158424942103.9574230633537
48132.49645112780993125.13738636266548117.77832159752104110.4192568323766103.06019206723217
49134.3889288726604126.34098012956642118.29303138647245110.24508264337848102.19713390028451
50136.21040535734892127.52948308902593118.84856082070294110.16763855237996101.48671628405697
51137.8466392967716128.64329445900245119.43994962123331110.23660478346417101.03325994569502
52139.19945460276048129.62924445072574120.05903429869099110.48882414665624100.9186139946215
53140.1950055547042130.44509146410348120.69517737350274110.945263282902101.19534919230128
54140.79015691470516131.06318725248457121.33621759026396111.60924792804336101.88227826582275
55140.97626533174446131.47291078910447121.96955624646452112.46620170382455102.9628471611846
56140.77995945870256131.6816210278823122.58328259706207113.48494416624182104.38660573542157
57140.2608570959882131.71404745092576123.16723780586335114.62042816080093106.07361851573852
58139.5065053256598131.6102138648828123.71392240410584115.81763094332887107.9213394825519
59138.62515648619677131.4221613409319124.21916619566703117.01617105040216109.8131759051373
60137.7372262869952131.2098635276296124.68250076826405118.15513800889848111.62777524953292
61136.96623775826222131.0367195467951125.10720133532797119.17768312386085113.24816491239372
62136.42944797138296130.96472107116267125.49999417094236120.03526727072206114.57054037050175
63136.22726554012488131.04886065596838125.87045577181189120.6920508876554115.51364600349889
64136.43060069072433131.33037905402867126.230157417333121.12993578063734116.02971414394166
65137.06878377954558131.8302076606066126.59163154166757121.35305542272856116.11447930378954
66138.12465065906432132.5459514538941126.9672522487239121.38855304355369115.80985383838346
67139.53989769930303133.45401383480544127.36812997030788121.2822461058103115.19636224131273
68141.22591219022797134.5145155972837127.80311900433938121.09172241139508114.38032581845077
69143.07430661728296135.67616660203615128.27802658678937120.87988657154257113.48174655629578
70144.9659868609782136.88054050478212128.79509414858606120.70964779238999112.62420143619393
71146.77999404813113138.0663955716984129.35279709526566120.63919861883292111.92560014240019
72148.40274791188529139.1743644531702129.9459809944551120.71759753574003111.48921407702495
73149.7372310064368140.15177650620086130.56632200596493120.98086750572901111.39541300549307
74150.7111716289501140.95712102729638131.2030704256427121.44901982398899111.69496922233529
75151.2832944894774141.56365270695355131.8440109244297122.12436914190586112.40472735938202
76151.44694145156345141.96174757944448132.47655370732554122.99135983520658113.50616596308762
77151.2306783629382142.159768742609133.08885912227984124.01794950195067114.94703988162149
78150.69584577480683142.18337051792764133.67089526104846125.15842000416927116.64594474729007
79149.93135875840417142.0733464190418134.21533407967942126.35732174031705118.49930940095467
80149.04638529170163141.882295641278134.71820599085441127.55411634043081120.39002669000722
81148.16175684928777141.6705056522946135.17925445530142128.68800325830824122.19675206131508