|
2 | 2 | #include <scratchcpp/variable.h> |
3 | 3 | #include <scratchcpp/list.h> |
4 | 4 | #include <scratchcpp/costume.h> |
| 5 | +#include <scratchcpp/scratchconfiguration.h> |
| 6 | +#include <scratchcpp/rect.h> |
5 | 7 | #include <enginemock.h> |
| 8 | +#include <imageformatfactorymock.h> |
| 9 | +#include <imageformatmock.h> |
6 | 10 |
|
7 | 11 | #include "../common.h" |
8 | 12 |
|
9 | 13 | using namespace libscratchcpp; |
10 | 14 |
|
11 | 15 | using ::testing::_; |
12 | 16 | using ::testing::SaveArg; |
| 17 | +using ::testing::Return; |
13 | 18 |
|
14 | 19 | TEST(SpriteTest, IsStage) |
15 | 20 | { |
@@ -375,3 +380,98 @@ TEST(SpriteTest, RotationStyle) |
375 | 380 | ASSERT_EQ(sprite.rotationStyleStr(), "all around"); |
376 | 381 | ASSERT_EQ(c2->mirrorHorizontally(), false); |
377 | 382 | } |
| 383 | + |
| 384 | +TEST(SpriteTest, BoundingRect) |
| 385 | +{ |
| 386 | + auto imageFormatFactory = std::make_shared<ImageFormatFactoryMock>(); |
| 387 | + auto imageFormat = std::make_shared<ImageFormatMock>(); |
| 388 | + |
| 389 | + ScratchConfiguration::registerImageFormat("test", imageFormatFactory); |
| 390 | + EXPECT_CALL(*imageFormatFactory, createInstance()).WillOnce(Return(imageFormat)); |
| 391 | + EXPECT_CALL(*imageFormat, width()).WillOnce(Return(0)); |
| 392 | + EXPECT_CALL(*imageFormat, height()).WillOnce(Return(0)); |
| 393 | + auto costume = std::make_shared<Costume>("costume1", "a", "test"); |
| 394 | + |
| 395 | + Sprite sprite; |
| 396 | + sprite.addCostume(costume); |
| 397 | + |
| 398 | + static char data[5] = "abcd"; |
| 399 | + EXPECT_CALL(*imageFormat, setData(5, data)); |
| 400 | + EXPECT_CALL(*imageFormat, width()).WillOnce(Return(4)); |
| 401 | + EXPECT_CALL(*imageFormat, height()).WillOnce(Return(3)); |
| 402 | + |
| 403 | + EXPECT_CALL(*imageFormat, colorAt(0, 0, 1)).WillOnce(Return(rgba(0, 0, 0, 0))); |
| 404 | + EXPECT_CALL(*imageFormat, colorAt(1, 0, 1)).WillOnce(Return(rgba(0, 0, 0, 0))); |
| 405 | + EXPECT_CALL(*imageFormat, colorAt(2, 0, 1)).WillOnce(Return(rgba(0, 0, 0, 255))); |
| 406 | + EXPECT_CALL(*imageFormat, colorAt(3, 0, 1)).WillOnce(Return(rgba(0, 0, 0, 0))); |
| 407 | + |
| 408 | + EXPECT_CALL(*imageFormat, colorAt(0, 1, 1)).WillOnce(Return(rgba(0, 0, 0, 0))); |
| 409 | + EXPECT_CALL(*imageFormat, colorAt(1, 1, 1)).WillOnce(Return(rgba(0, 0, 0, 255))); |
| 410 | + EXPECT_CALL(*imageFormat, colorAt(2, 1, 1)).WillOnce(Return(rgba(0, 0, 0, 0))); |
| 411 | + EXPECT_CALL(*imageFormat, colorAt(3, 1, 1)).WillOnce(Return(rgba(0, 0, 0, 255))); |
| 412 | + |
| 413 | + EXPECT_CALL(*imageFormat, colorAt(0, 2, 1)).WillOnce(Return(rgba(0, 0, 0, 255))); |
| 414 | + EXPECT_CALL(*imageFormat, colorAt(1, 2, 1)).WillOnce(Return(rgba(0, 0, 0, 0))); |
| 415 | + EXPECT_CALL(*imageFormat, colorAt(2, 2, 1)).WillOnce(Return(rgba(0, 0, 0, 0))); |
| 416 | + EXPECT_CALL(*imageFormat, colorAt(3, 2, 1)).WillOnce(Return(rgba(0, 0, 0, 0))); |
| 417 | + costume->setData(5, data); |
| 418 | + |
| 419 | + EXPECT_CALL(*imageFormat, width()).WillOnce(Return(4)); |
| 420 | + EXPECT_CALL(*imageFormat, height()).WillOnce(Return(3)); |
| 421 | + Rect rect = sprite.boundingRect(); |
| 422 | + ASSERT_EQ(rect.left(), -2); |
| 423 | + ASSERT_EQ(rect.top(), 0.5); |
| 424 | + ASSERT_EQ(rect.right(), 1); |
| 425 | + ASSERT_EQ(rect.bottom(), -1.5); |
| 426 | + |
| 427 | + sprite.setDirection(45); |
| 428 | + EXPECT_CALL(*imageFormat, width()).WillOnce(Return(4)); |
| 429 | + EXPECT_CALL(*imageFormat, height()).WillOnce(Return(3)); |
| 430 | + rect = sprite.boundingRect(); |
| 431 | + ASSERT_EQ(std::round(rect.left() * 10000) / 10000, -1.7678); |
| 432 | + ASSERT_EQ(std::round(rect.top() * 10000) / 10000, 0.3536); |
| 433 | + ASSERT_EQ(std::round(rect.right() * 10000) / 10000, 1.0607); |
| 434 | + ASSERT_EQ(std::round(rect.bottom() * 10000) / 10000, -1.0607); |
| 435 | + |
| 436 | + sprite.setDirection(-160); |
| 437 | + EXPECT_CALL(*imageFormat, width()).WillOnce(Return(4)); |
| 438 | + EXPECT_CALL(*imageFormat, height()).WillOnce(Return(3)); |
| 439 | + rect = sprite.boundingRect(); |
| 440 | + ASSERT_EQ(std::round(rect.left() * 10000) / 10000, -1.4095); |
| 441 | + ASSERT_EQ(std::round(rect.top() * 10000) / 10000, 1.7084); |
| 442 | + ASSERT_EQ(std::round(rect.right() * 10000) / 10000, 1.1539); |
| 443 | + ASSERT_EQ(std::round(rect.bottom() * 10000) / 10000, -0.7687); |
| 444 | + |
| 445 | + sprite.setX(86.48); |
| 446 | + sprite.setY(-147.16); |
| 447 | + EXPECT_CALL(*imageFormat, width()).WillOnce(Return(4)); |
| 448 | + EXPECT_CALL(*imageFormat, height()).WillOnce(Return(3)); |
| 449 | + rect = sprite.boundingRect(); |
| 450 | + ASSERT_EQ(std::round(rect.left() * 10000) / 10000, 85.0705); |
| 451 | + ASSERT_EQ(std::round(rect.top() * 10000) / 10000, -145.4516); |
| 452 | + ASSERT_EQ(std::round(rect.right() * 10000) / 10000, 87.6339); |
| 453 | + ASSERT_EQ(std::round(rect.bottom() * 10000) / 10000, -147.9287); |
| 454 | + |
| 455 | + costume->setRotationCenterX(-4); |
| 456 | + costume->setRotationCenterY(8); |
| 457 | + EXPECT_CALL(*imageFormat, width()).WillOnce(Return(4)); |
| 458 | + EXPECT_CALL(*imageFormat, height()).WillOnce(Return(3)); |
| 459 | + rect = sprite.boundingRect(); |
| 460 | + ASSERT_EQ(std::round(rect.left() * 10000) / 10000, 76.1848); |
| 461 | + ASSERT_EQ(std::round(rect.top() * 10000) / 10000, -146.4742); |
| 462 | + ASSERT_EQ(std::round(rect.right() * 10000) / 10000, 78.7483); |
| 463 | + ASSERT_EQ(std::round(rect.bottom() * 10000) / 10000, -148.9513); |
| 464 | + |
| 465 | + sprite.setDirection(90); |
| 466 | + sprite.setX(0); |
| 467 | + sprite.setY(0); |
| 468 | + EXPECT_CALL(*imageFormat, width()).WillOnce(Return(4)); |
| 469 | + EXPECT_CALL(*imageFormat, height()).WillOnce(Return(3)); |
| 470 | + rect = sprite.boundingRect(); |
| 471 | + ASSERT_EQ(rect.left(), 2); |
| 472 | + ASSERT_EQ(rect.top(), -7.5); |
| 473 | + ASSERT_EQ(rect.right(), 5); |
| 474 | + ASSERT_EQ(rect.bottom(), -9.5); |
| 475 | + |
| 476 | + ScratchConfiguration::removeImageFormat("test"); |
| 477 | +} |
0 commit comments