package org.eclipse.nebula.widgets.nattable.renderer.swt.layer.viewport

import java.math.BigDecimal
import org.eclipse.nebula.widgets.nattable.core.layer.impl.viewport.ViewportAxis
import org.eclipse.swt.widgets.ScrollBar
import org.junit.Before
import org.junit.Test
import org.junit.runner.RunWith
import org.mockito.Mock
import org.mockito.runners.MockitoJUnitRunner

import static org.junit.Assert.*
import static org.mockito.Mockito.*

import static extension org.eclipse.nebula.widgets.nattable.renderer.swt.layer.viewport.ScrollBarHandler.*

@RunWith(typeof(MockitoJUnitRunner))
class ScrollBarHandlerTest {

	@Mock ScrollBar scrollBar
	@Mock ViewportAxis viewportAxis
	ScrollBarHandler scrollBarHandler
	
	@Before
	def void before() {
		scrollBarHandler = spy(new ScrollBarHandler(scrollBar, viewportAxis))
	}
	
	@Test
	def void scaleWithinIntRange() {
		assertEquals(1, new BigDecimal(1.0).scaleToInt(new BigDecimal(100.0)))
		assertEquals(new BigDecimal(1.0), 1.scaleToBigDecimal(new BigDecimal(100.0)))
	}
	
	@Test
	def void scaleOutsideIntRange() {
		val int maxIntDiv2 = Integer::MAX_VALUE / 2
		val BigDecimal maxIntTimes2 = new BigDecimal(Integer::MAX_VALUE) * new BigDecimal(2)
		val BigDecimal maxIntTimes4 = new BigDecimal(Integer::MAX_VALUE) * new BigDecimal(4)
		
		assertEquals(maxIntDiv2, maxIntTimes2.scaleToInt(maxIntTimes4))
		assertEquals(maxIntTimes2.doubleValue, maxIntDiv2.scaleToBigDecimal(maxIntTimes4).doubleValue, 2)  // close enough!
	}
	
}