@@ -277,3 +277,88 @@ func assertPanics(t *testing.T, fn func(), wantContains string) {
277277 }()
278278 fn ()
279279}
280+
281+ func TestTempRegisteredExtras (t * testing.T ) {
282+ TestOnlyClearRegisteredExtras ()
283+ t .Cleanup (TestOnlyClearRegisteredExtras )
284+
285+ type (
286+ primaryCC struct {
287+ X int
288+ NOOPHooks
289+ }
290+ primaryRules struct {
291+ X int
292+ NOOPHooks
293+ }
294+
295+ overrideCC struct {
296+ X string
297+ NOOPHooks
298+ }
299+ overrideRules struct {
300+ X string
301+ NOOPHooks
302+ }
303+ )
304+
305+ primary := Extras [primaryCC , primaryRules ]{
306+ NewRules : func (_ * ChainConfig , _ * Rules , cc primaryCC , _ * big.Int , _ bool , _ uint64 ) primaryRules {
307+ return primaryRules {
308+ X : cc .X ,
309+ }
310+ },
311+ }
312+ override := Extras [overrideCC , overrideRules ]{
313+ NewRules : func (_ * ChainConfig , _ * Rules , cc overrideCC , _ * big.Int , _ bool , _ uint64 ) overrideRules {
314+ return overrideRules {
315+ X : cc .X ,
316+ }
317+ },
318+ }
319+
320+ extras := RegisterExtras (primary )
321+ testPrimaryExtras := func (t * testing.T ) {
322+ t .Helper ()
323+ assertRulesCopiedFromChainConfig (
324+ t , extras , 42 ,
325+ func (cc * primaryCC , x int ) { cc .X = x },
326+ func (r * primaryRules ) int { return r .X },
327+ )
328+ }
329+
330+ t .Run ("before_temp" , testPrimaryExtras )
331+ t .Run ("WithTempRegisteredExtras" , func (t * testing.T ) {
332+ WithTempRegisteredExtras (
333+ override ,
334+ func (extras ExtraPayloads [overrideCC , overrideRules ]) { // deliberately shadow `extras`
335+ assertRulesCopiedFromChainConfig (
336+ t , extras , "hello, world" ,
337+ func (cc * overrideCC , x string ) { cc .X = x },
338+ func (r * overrideRules ) string { return r .X },
339+ )
340+ },
341+ )
342+ })
343+ t .Run ("after_temp" , testPrimaryExtras )
344+ }
345+
346+ func assertRulesCopiedFromChainConfig [C ChainConfigHooks , R RulesHooks , Payload any ](
347+ t * testing.T ,
348+ extras ExtraPayloads [C , R ],
349+ val Payload ,
350+ setX func (* C , Payload ),
351+ getX func (* R ) Payload ,
352+ ) {
353+ t .Helper ()
354+
355+ cc := new (ChainConfig )
356+ var ccExtra C
357+ setX (& ccExtra , val )
358+
359+ extras .ChainConfig .Set (cc , ccExtra )
360+ rules := cc .Rules (nil , false , 0 )
361+ rulesExtra := extras .Rules .Get (& rules )
362+
363+ assert .Equalf (t , val , getX (& rulesExtra ), "%T.X copied from %T.X" , rulesExtra , ccExtra )
364+ }
0 commit comments