|
10 | 10 | #include <enginemock.h> |
11 | 11 | #include <randomgeneratormock.h> |
12 | 12 | #include <stacktimermock.h> |
| 13 | +#include <spritehandlermock.h> |
13 | 14 |
|
14 | 15 | #include "../common.h" |
15 | 16 | #include "blocks/motionblocks.h" |
@@ -1730,3 +1731,94 @@ TEST_F(MotionBlocksTest, SetY) |
1730 | 1731 | builder.run(); |
1731 | 1732 | } |
1732 | 1733 | } |
| 1734 | + |
| 1735 | +TEST_F(MotionBlocksTest, IfOnEdgeBounce) |
| 1736 | +{ |
| 1737 | + { |
| 1738 | + auto sprite = std::make_shared<Sprite>(); |
| 1739 | + SpriteHandlerMock handler; |
| 1740 | + sprite->setInterface(&handler); |
| 1741 | + sprite->setEngine(&m_engineMock); |
| 1742 | + |
| 1743 | + ScriptBuilder builder(m_extension.get(), m_engine, sprite); |
| 1744 | + |
| 1745 | + builder.addBlock("motion_ifonedgebounce"); |
| 1746 | + auto block = builder.currentBlock(); |
| 1747 | + |
| 1748 | + Compiler compiler(&m_engineMock, sprite.get()); |
| 1749 | + auto code = compiler.compile(block); |
| 1750 | + Script script(sprite.get(), block, &m_engineMock); |
| 1751 | + script.setCode(code); |
| 1752 | + Thread thread(sprite.get(), &m_engineMock, &script); |
| 1753 | + |
| 1754 | + EXPECT_CALL(m_engineMock, stageWidth()).WillRepeatedly(Return(480)); |
| 1755 | + EXPECT_CALL(m_engineMock, stageHeight()).WillRepeatedly(Return(360)); |
| 1756 | + EXPECT_CALL(m_engineMock, spriteFencingEnabled()).WillRepeatedly(Return(false)); |
| 1757 | + |
| 1758 | + // No edge |
| 1759 | + EXPECT_CALL(handler, boundingRect()).WillOnce(Return(Rect(80, 80, 120, 40))); |
| 1760 | + sprite->setX(100); |
| 1761 | + sprite->setY(60); |
| 1762 | + sprite->setDirection(-45); |
| 1763 | + thread.run(); |
| 1764 | + |
| 1765 | + ASSERT_EQ(sprite->x(), 100); |
| 1766 | + ASSERT_EQ(sprite->y(), 60); |
| 1767 | + ASSERT_EQ(sprite->direction(), -45); |
| 1768 | + |
| 1769 | + // Left edge |
| 1770 | + EXPECT_CALL(handler, boundingRect()).Times(2).WillRepeatedly(Return(Rect(-260, 80, -220, 40))); |
| 1771 | + sprite->setX(-240); |
| 1772 | + sprite->setY(60); |
| 1773 | + thread.reset(); |
| 1774 | + thread.run(); |
| 1775 | + |
| 1776 | + ASSERT_EQ(sprite->x(), -220); |
| 1777 | + ASSERT_EQ(sprite->y(), 60); |
| 1778 | + ASSERT_EQ(std::round(sprite->direction() * 100) / 100, 45); |
| 1779 | + |
| 1780 | + // Top edge |
| 1781 | + EXPECT_CALL(handler, boundingRect()).Times(2).WillRepeatedly(Return(Rect(80, 200, 120, 160))); |
| 1782 | + sprite->setX(100); |
| 1783 | + sprite->setY(180); |
| 1784 | + sprite->setDirection(45); |
| 1785 | + thread.reset(); |
| 1786 | + thread.run(); |
| 1787 | + |
| 1788 | + ASSERT_EQ(sprite->x(), 100); |
| 1789 | + ASSERT_EQ(sprite->y(), 160); |
| 1790 | + ASSERT_EQ(sprite->direction(), 135); |
| 1791 | + |
| 1792 | + // Right edge |
| 1793 | + EXPECT_CALL(handler, boundingRect()).Times(2).WillRepeatedly(Return(Rect(220, 80, 260, 40))); |
| 1794 | + sprite->setX(240); |
| 1795 | + sprite->setY(60); |
| 1796 | + thread.reset(); |
| 1797 | + thread.run(); |
| 1798 | + |
| 1799 | + ASSERT_EQ(sprite->x(), 220); |
| 1800 | + ASSERT_EQ(sprite->y(), 60); |
| 1801 | + ASSERT_EQ(sprite->direction(), -135); |
| 1802 | + |
| 1803 | + // Bottom edge |
| 1804 | + EXPECT_CALL(handler, boundingRect()).Times(2).WillRepeatedly(Return(Rect(-120, -160, -80, -200))); |
| 1805 | + sprite->setX(-100); |
| 1806 | + sprite->setY(-180); |
| 1807 | + thread.reset(); |
| 1808 | + thread.run(); |
| 1809 | + |
| 1810 | + ASSERT_EQ(sprite->x(), -100); |
| 1811 | + ASSERT_EQ(sprite->y(), -160); |
| 1812 | + ASSERT_EQ(std::round(sprite->direction() * 100) / 100, -45); |
| 1813 | + } |
| 1814 | + |
| 1815 | + { |
| 1816 | + auto stage = std::make_shared<Stage>(); |
| 1817 | + ScriptBuilder builder(m_extension.get(), m_engine, stage); |
| 1818 | + |
| 1819 | + builder.addBlock("motion_ifonedgebounce"); |
| 1820 | + |
| 1821 | + builder.build(); |
| 1822 | + builder.run(); |
| 1823 | + } |
| 1824 | +} |
0 commit comments