package;

import massive.munit.util.Timer;
import massive.munit.Assert;
import massive.munit.async.AsyncFactory;
import funkin.util.DateUtil;

@:nullSafety
class MockTest extends FunkinTest
{
  public function new()
  {
    super();
  }

  @BeforeClass
  public function beforeClass() {}

  @AfterClass
  public function afterClass() {}

  @Before
  public function setup() {}

  @After
  public function tearDown() {}

  @Test
  public function testMock()
  {
    // Test that mocking works.

    var mockSprite = Mockatoo.mock(flixel.FlxSprite);
    var mockAnim = Mockatoo.mock(flixel.animation.FlxAnimationController);
    mockSprite.animation = mockAnim;

    var animData:funkin.data.animation.AnimationData =
      {
        name: "testAnim",
        prefix: "blablabla"
      };

    mockSprite.animation.addByPrefix("testAnim", "blablabla", 24, false, false, false);

    // Verify that the method was called once.
    // If not, a VerificationException will be thrown and the test will fail.
    mockAnim.addByPrefix("testAnim", "blablabla", 24, false, false, false).verify(times(1));

    FunkinAssert.validateThrows(function() {
      // Attempt to verify the method was called.
      // This should FAIL, since we didn't call the method.
      mockAnim.addByPrefix("testAnim", "blablabla", 24, false, false, false).verify(times(1));
    }, function(err) {
      return Std.isOfType(err, mockatoo.exception.VerificationException);
    });
  }
}