summaryrefslogtreecommitdiff
path: root/test/03-test-clipper.js
blob: 923a8a5cfd9679947a0cae30ba0f161f7f2ccf3d (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
var assert = require("assert")
var vec = require("../public/assets/javascripts/rectangles/models/vec2.js")
var Rect = require("../public/assets/javascripts/rectangles/models/rect.js")
var Room = require("../public/assets/javascripts/rectangles/models/room.js")
var Rooms = require("../public/assets/javascripts/rectangles/engine/rooms/_rooms.js")
var Clipper = require("../public/assets/javascripts/rectangles/engine/rooms/clipper.js")
var FRONT = 0x1, BACK = 0x2, LEFT = 0x4, RIGHT = 0x8, FLOOR = 0x10, CEILING = 0x20
var ALL = FRONT | BACK | LEFT | RIGHT

var rect      = new Rect( new vec(1,5), new vec(1,5) )
var east      = new Rect( new vec(2,6), new vec(1,5) )
var corner    = new Rect( new vec(3,7), new vec(3,7) )
var peninsula = new Rect( new vec(4,6), new vec(6,8) )

function report(a) {
  console.log( a.join("\n") )
}

describe('clipper', function(){
  Rooms.list = {}
  Rooms.regions = []
  Rooms.add_with_rect( rect )
  Rooms.add_with_rect( east )

  describe('#clip_rects(rect, east)', function(){
    Rooms.clipper.reset_rects()
    var regions = Rooms.clipper.clip_rects()

    it('contains duplicates', function(){
      var map = {}
      var state = regions.some(function(a){
        var s = a.toString()
        if (s in map) return true
        map[s] = s
        return false
      })
      assert.equal(true, state)
    })
  })

  describe('#cull_rects(rect, east)', function(){
    Rooms.clipper.reset_rects()
    var regions = Rooms.clipper.clip_rects()
    var culled = Rooms.clipper.cull_rects_iterative()
    var culled_dupes = regions.filter(function(r){ return r.dupe })

    it('clipper returns 4 rects', function(){
      assert.equal(4, regions.length)
    })
    it('culling marks 1 duplicate', function(){
      assert.equal(1, culled_dupes.length)
    })
    it('culling returns 3 non-duplicate', function(){
      assert.equal(3, culled.length)
    })
  })

  //

  Rooms.list = {}
  Rooms.regions = []
  Rooms.add_with_rect( rect )
  Rooms.add_with_rect( corner )

  describe('#cull_rects(rect, corner)', function(){
    Rooms.clipper.reset_rects()
    var regions = Rooms.clipper.clip_rects()
    var culled = Rooms.clipper.cull_rects_iterative()
    var culled_dupes = regions.filter(function(r){ return r.dupe })

    it('clipper returns 8 rects', function(){
      assert.equal(8, regions.length)
    })
    it('culling marks 1 duplicate', function(){
      assert.equal(1, culled_dupes.length)
    })
    it('culling returns 7 non-duplicate', function(){
      assert.equal(7, culled.length)
    })
  })

  //

  Rooms.list = {}
  Rooms.regions = []
  Rooms.add_with_rect( rect )
  Rooms.add_with_rect( corner )
  Rooms.add_with_rect( peninsula )

/*
  // this method uses a tree to match areas, which tends to leave extra overlapping regions
  describe('#cull_rects(rect, corner, peninsula)', function(){
    Rooms.clipper.reset_rects()
    var regions = Rooms.clipper.clip_rects()
    var culled = Rooms.clipper.cull_rects()
    var culled_dupes = regions.filter(function(r){ return r.dupe })

    it('clipper returns 16 rects', function(){
      assert.equal(16, regions.length)
    })
    it('culling marks 3 duplicate', function(){
      assert.equal(3, culled_dupes.length)
    })
    it('culling returns 13 non-duplicate', function(){
      assert.equal(13, regions.length)
    })
  })
*/

  // this method iterates to match areas, which omits regions in some cases
  describe('#cull_rects_iterative(rect, corner, peninsula)', function(){
    Rooms.clipper.reset_rects()
    var regions = Rooms.clipper.clip_rects()
    var culled = Rooms.clipper.cull_rects_iterative()
    var culled_dupes = regions.filter(function(r){ return r.dupe })

    it('clipper returns 16 rects', function(){
      assert.equal(16, regions.length)
    })
    it('culling marks 3 duplicate', function(){
      assert.equal(3, culled_dupes.length)
    })
    it('culling returns 14 non-duplicate', function(){
      assert.equal(13, culled.length)
    })
  })

})