public void Calculate_ScrollerElementIsNOTUndersizedToCursorLength_NormalizedCursoredPositionOnAxisNotWithinRange_ReturnsNonZeroVarious(
        Vector2 normalizedCursoredPosition,
        Vector2 scrollerElementLength,
        Vector2 cursorLength,
        Vector2 expected
        )
    {
        IScroller scroller = Substitute.For <IScroller>();

        scroller.ScrollerElementIsUndersizedTo(Arg.Any <Vector2>(), Arg.Any <int>()).Returns(false);
        Vector2 anyCursorPosition = Vector2.zero;
        ElementCursorOffsetInPixelCalculator calculator = new ElementCursorOffsetInPixelCalculator(
            scroller,
            cursorLength,
            anyCursorPosition,
            scrollerElementLength
            );

        for (int i = 0; i < 2; i++)
        {
            scroller.GetNormalizedCursoredPositionOnAxis(Arg.Any <float>(), i).Returns(normalizedCursoredPosition[i]);

            float actual = calculator.Calculate(normalizedCursoredPosition[i], i);
            Assert.That(actual, Is.EqualTo(expected[i]));
        }
    }
    public void Calculate_ScrollerElementIsNOTUndersizedToCursorLength_NormalizedCursoredPositionOnAxisWithinRange_ReturnsZero(
        Vector2 normalizedCursoredPosition
        )
    {
        IScroller scroller = Substitute.For <IScroller>();

        scroller.ScrollerElementIsUndersizedTo(Arg.Any <Vector2>(), Arg.Any <int>()).Returns(false);
        Vector2 anyCursorLength          = Vector2.zero;
        Vector2 anyCursorPosition        = Vector2.zero;
        Vector2 anyScrollerElementLength = Vector2.zero;
        ElementCursorOffsetInPixelCalculator calculator = new ElementCursorOffsetInPixelCalculator(
            scroller,
            anyCursorLength,
            anyCursorPosition,
            anyScrollerElementLength
            );

        float anyLocalPos = 0f;

        for (int i = 0; i < 2; i++)
        {
            scroller.GetNormalizedCursoredPositionOnAxis(Arg.Any <float>(), i).Returns(normalizedCursoredPosition[i]);

            float actual = calculator.Calculate(anyLocalPos, i);
            Assert.That(actual, Is.EqualTo(0f));
        }
    }
    public void Calculate_ScrollerElementIsUndersizedToCursorLength_ReturnLocalPosDiff(Vector2 cursorLocalPos, Vector2 scrollerElementLocalPos, Vector2 expected)
    {
        Vector2   anyCursorLength          = new Vector2(1000f, 10000f);
        Vector2   anyScrollerElementLength = new Vector2(100f, 100000f);
        IScroller scroller = Substitute.For <IScroller>();

        scroller.ScrollerElementIsUndersizedTo(Arg.Any <Vector2>(), Arg.Any <int>()).Returns(true);
        ElementCursorOffsetInPixelCalculator calculator = new ElementCursorOffsetInPixelCalculator(
            scroller,
            anyCursorLength,
            cursorLocalPos,
            anyScrollerElementLength
            );

        for (int i = 0; i < 2; i++)
        {
            float actual = calculator.Calculate(scrollerElementLocalPos[i], i);

            Assert.That(actual, Is.EqualTo(expected[i]));
        }
    }
 public float Calculate(float scrollerElementLocalPosOnAxis, int dimension)
 {
     if (thisScroller.ScrollerElementIsUndersizedTo(thisCursorLength, dimension))
     {
         return(thisCursorLocalPosition[dimension] - scrollerElementLocalPosOnAxis);
     }
     else
     {
         float elementNormalizedCursoredPos = thisScroller.GetNormalizedCursoredPositionOnAxis(scrollerElementLocalPosOnAxis, dimension);
         float normalizedOffset             = elementNormalizedCursoredPos;
         if (elementNormalizedCursoredPos <= 1f && elementNormalizedCursoredPos >= 0f)
         {
             normalizedOffset = 0f;
         }
         else if (elementNormalizedCursoredPos > 1f)
         {
             normalizedOffset = elementNormalizedCursoredPos - 1f;
         }
         return(normalizedOffset * (thisScrollerElementLength[dimension] - thisCursorLength[dimension]));
     }
 }