首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >碰撞单元试验

碰撞单元试验
EN

Code Review用户
提问于 2013-08-14 17:33:49
回答 1查看 327关注 0票数 1

我发现为我的冲突类编写单元测试有点乏味,因为有太多不同的冲突需要测试。在每个测试的设置和断言阶段,我都看到了重复,但我看不出如何在保持代码清晰简洁的同时减少重复。

代码语言:javascript
复制
package tests.kris {
  import asunitsrc.asunit.framework.TestCase;
  import flash.geom.Rectangle;
  import kris.RectangleCollision;
  public class RectangleCollisionTest extends TestCase {
    public function RectangleCollisionTest(testMethod:String):void {
      super(testMethod);
    }

    // detect
    public function detect_should_throw_error_when_both_arguments_are_the_same_object():void {
      var callOn:Rectangle = new Rectangle(0, 0, 0, 0);
      assertThrowsError(RectangleCollision.detect, callOn, callOn);
    }

    public function calling_detect_on_intersecting_rectangles_should_return_true():void {
      var callOn:Rectangle = new Rectangle(1, 1, 5, 5);
      var callWith:Rectangle = new Rectangle(2, 2, 5, 5);
      assertTrue(areColliding(callOn, callWith));
    }

    public function calling_detect_on_rectangles_with_a_touching_side_should_return_false():void {
      var callOn:Rectangle = new Rectangle(0, 0, 5, 5);
      var callWith:Rectangle = new Rectangle(5, 0, 5, 5);
      assertFalse(areColliding(callOn, callWith));
    }

    // Currently only works with rectangles that are rougly the same size and have shallow collisions

    // resolve
    public function calling_resolve_should_throw_error_when_both_arguments_are_the_same_object():void {
      var reactionary:Rectangle = newRectangle(0, 0, 0, 0);
      assertThrowsError(RectangleCollision.resolve, reactionary, reactionary);
    }

    public function calling_reslove_on_not_colliding_rectangles_returns_reactionary():void {
      var reactionary:Rectangle = new Rectangle(0, 0, 100, 100);
      var stationary:Rectangle = new Rectangle(200, 200, 100, 100);
      var result:Rectangle = RectangleCollision.resolve(reactionary, stationary);
      assertPosition(reactionary, 0, 0);
      assertPosition(stationary, 200, 200);
      assertPosition(result, 0, 0);
    }

    public function should_reslove_to_left_correctly_1():void {
      var reactionary:Rectangle = new Rectangle(2, 1, 100, 100);
      var stationary:Rectangle = new Rectangle(100, 0, 100, 100);
      var result:Rectangle = RectangleCollision.resolve(reactionary, stationary);
      assertPosition(reactionary, 2, 1);
      assertPosition(stationary, 100, 0);
      assertPosition(result, 0, 1);
    }

    public function should_reslove_to_left_correctly_2():void {
      var reactionary:Rectangle = new Rectangle(2, -1, 100, 100);
      var stationary:Rectangle = new Rectangle(100, 0, 100, 100);
      var result:Rectangle = RectangleCollision.resolve(reactionary, stationary);
      assertPosition(reactionary, 2, -1);
      assertPosition(stationary, 100, 0);
      assertPosition(result, 0, -1);
    }

    public function should_reslove_to_right_correctly_1():void {
      var reactionary:Rectangle = new Rectangle(98, 1, 100, 100);
      var stationary:Rectangle = new Rectangle(0, 0, 100, 100);
      var result:Rectangle = RectangleCollision.resolve(reactionary, stationary);
      assertPosition(reactionary, 98, 1);
      assertPosition(stationary, 0, 0);
      assertPosition(result, 100, 1);
    }

    public function should_reslove_to_right_correctly_2():void {
      var reactionary:Rectangle = new Rectangle(98, -1, 100, 100);
      var stationary:Rectangle = new Rectangle(0, 0, 100, 100);
      var result:Rectangle = RectangleCollision.resolve(reactionary, stationary);
      assertPosition(reactionary, 98, -1);
      assertPosition(stationary, 0, 0);
      assertPosition(result, 100, -1);
    }

    public function should_reslove_to_top_correctly_1():void {
      var reactionary:Rectangle = new Rectangle(1, 2, 100, 100);
      var stationary:Rectangle = new Rectangle(0, 100, 100, 100);
      var result:Rectangle = RectangleCollision.resolve(reactionary, stationary);
      assertPosition(reactionary, 1, 2);
      assertPosition(stationary, 0, 100);
      assertPosition(result, 1, 0);
    }

    public function should_reslove_to_top_correctly_2():void {
      var reactionary:Rectangle = new Rectangle(-1, 2, 100, 100);
      var stationary:Rectangle = new Rectangle(0, 100, 100, 100);
      var result:Rectangle = RectangleCollision.resolve(reactionary, stationary);
      assertPosition(reactionary, -1, 2);
      assertPosition(stationary, 0, 100);
      assertPosition(result, -1, 0);
    }

    public function should_reslove_to_bottom_correctly_1():void {
      var reactionary:Rectangle = new Rectangle(1, 98, 100, 100);
      var stationary:Rectangle = new Rectangle(0, 0, 100, 100);
      var result:Rectangle = RectangleCollision.resolve(reactionary, stationary);
      assertPosition(reactionary, 1, 98);
      assertPosition(stationary, 0, 0);
      assertPosition(result, 1, 100);
    }

    public function should_reslove_to_bottom_correctly_2():void {
      var reactionary:Rectangle = new Rectangle(-1, 98, 100, 100);
      var stationary:Rectangle = new Rectangle(0, 0, 100, 100);
      var result:Rectangle = RectangleCollision.resolve(reactionary, stationary);
      assertPosition(reactionary, -1, 98);
      assertPosition(stationary, 0, 0);
      assertPosition(result, -1, 100);
    }

    private function assertPosition(rect:Rectangle, x:Number, y:Number):void {
      assertEquals(x, rect.x);
      assertEquals(y, rect.y);
    }

    private function assertThrowsError(... args):void {
      assertTrue(functionThrowsError.apply(null, args));
    }

    private function functionThrowsError(functionToCall:Function, ... args):Boolean {
      try {
          functionToCall.apply(null, args);
          return false;
      } catch (error:Error) {
          return true;
      }
      throw new Error("Should not reach this point");
    }

    private function newRectangle(x:Number = 0, y:Number = 0, w:Number = 0, h:Number = 0):Rectangle {
      return new Rectangle(x, y, w, h);
    }

    private function areColliding(rectangle1:Rectangle, rectangle2:Rectangle):Boolean {
      return RectangleCollision.detect(rectangle1, rectangle2);
    }
  }
}
EN

回答 1

Code Review用户

发布于 2013-08-14 21:17:48

我不知道什么是最佳实践,但是您可以在安装方法中设置所需的矩形/位置/预期交叉点,这样测试itselfs就可以更短、更快地理解。

在过去的几周里,我自己写了一些交集单元测试,我知道有时候你会对测试应该做什么感到困惑。

此外,您可能应该检查退化的情况,即零宽度和/或高度的矩形。

票数 1
EN
页面原文内容由Code Review提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://codereview.stackexchange.com/questions/29754

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档