package disruptor

import "testing"

func BenchmarkSingleProducerSequencerPublish(b *testing.B) {
	sequencer := NewSingleProducerSequencer(NewSequence(), 1024, Barrier{})
	iterations := int64(b.N)
	b.ReportAllocs()
	b.ResetTimer()

	for i := int64(0); i < iterations; i++ {
		sequencer.Publish(i)
	}
}

func BenchmarkSingleProducerSequencerNext(b *testing.B) {
	consumerSequence := NewSequence()
	publisherSequence := NewSequence()
	consumerBarrier := NewBarrier(consumerSequence)

	sequencer := NewSingleProducerSequencer(publisherSequence, 1024, consumerBarrier)
	iterations := int64(b.N)
	b.ReportAllocs()
	b.ResetTimer()

	for i := int64(0); i < iterations; i++ {
		claimed := sequencer.Next(1)
		consumerSequence.Store(claimed)
	}
}

func BenchmarkSingleProducerSequencerNextWrapPoint(b *testing.B) {
	consumerSequence := NewSequence()
	publisherSequence := NewSequence()
	consumerBarrier := NewBarrier(consumerSequence)

	sequencer := NewSingleProducerSequencer(publisherSequence, 1024, consumerBarrier)
	iterations := int64(b.N)
	b.ReportAllocs()
	b.ResetTimer()

	consumerSequence.Store(MaxSequenceValue)
	for i := int64(0); i < iterations; i++ {
		sequencer.Next(1)
	}
}
