package keeper_test import ( "testing" sdk "github.com/cosmos/cosmos-sdk/types" "github.com/stretchr/testify/require" "mukan/x/poj/types" ) func TestProcessBlockReward(t *testing.T) { f := initFixture(t) miner := "mukan1miner" // Initial block height 1 ctx := sdk.UnwrapSDKContext(f.ctx).WithBlockHeight(1) // 1st Win allowed := f.keeper.ProcessBlockReward(ctx, miner) require.True(t, allowed) state, found := f.keeper.GetMinerState(ctx, miner) require.True(t, found) require.Equal(t, int64(1), state.ConsecutiveWins) require.Equal(t, int64(0), state.StreakCount) require.Equal(t, int64(0), state.CooldownUntil) // 2nd Win (at same height or next, doesn't matter for logic, but usually next) ctx = ctx.WithBlockHeight(2) allowed = f.keeper.ProcessBlockReward(ctx, miner) require.True(t, allowed) state, _ = f.keeper.GetMinerState(ctx, miner) require.Equal(t, int64(0), state.ConsecutiveWins) require.Equal(t, int64(1), state.StreakCount) require.Equal(t, int64(3), state.CooldownUntil) // current (2) + micro_cooldown (1) // Win at block 3 (should be rejected due to cooldown) ctx = ctx.WithBlockHeight(3) allowed = f.keeper.ProcessBlockReward(ctx, miner) require.False(t, allowed) // Win at block 4 (cooldown expired) ctx = ctx.WithBlockHeight(4) allowed = f.keeper.ProcessBlockReward(ctx, miner) require.True(t, allowed) } func TestMacroFren(t *testing.T) { f := initFixture(t) miner := "mukan1miner" // Set macro limit to 2 for faster testing params := types.DefaultParams() params.MacroStreakLimit = 2 f.keeper.Params.Set(f.ctx, params) // Streak 1 (wins at 1 and 2) f.keeper.ProcessBlockReward(sdk.UnwrapSDKContext(f.ctx).WithBlockHeight(1), miner) f.keeper.ProcessBlockReward(sdk.UnwrapSDKContext(f.ctx).WithBlockHeight(2), miner) state, _ := f.keeper.GetMinerState(f.ctx, miner) require.Equal(t, int64(1), state.StreakCount) require.Equal(t, int64(3), state.CooldownUntil) // Streak 2 (wins at 4 and 5) f.keeper.ProcessBlockReward(sdk.UnwrapSDKContext(f.ctx).WithBlockHeight(4), miner) f.keeper.ProcessBlockReward(sdk.UnwrapSDKContext(f.ctx).WithBlockHeight(5), miner) state, _ = f.keeper.GetMinerState(f.ctx, miner) require.Equal(t, int64(0), state.StreakCount) // Reset after Macro require.Equal(t, int64(10), state.CooldownUntil) // 5 + 5 (macro_cooldown) }