function test() {
    this.init();
    for (var i=0; i<10; i++) {
        delete this.blocks[10][9];
        this.collapse_blocks();
    }
    this.look_for_holes();
}
test.prototype.init = function() {
    this.blocks = new Array(20);
    for (var x=0; x<this.blocks.length; x++) {
        this.blocks[x] = new Array(10);
        for (var y=0; y<this.blocks[x].length; y++) {
            this.blocks[x][y] = {};
        }
    }
}
test.prototype.move_block = function(x,y,x1,y1) {
    this.blocks[x][y] = this.blocks[x1][y1];
    if (this.blocks[x][y])
        delete this.blocks[x1][y1];
}
test.prototype.collapse_blocks = function() {
    var didSomething=0;
    do {
        didSomething=0;
        for (var x=0; x<this.blocks.length; x++)
            for (var y=1; y<this.blocks[x].length; y++) {
                if (!this.blocks[x][y] && this.blocks[x][y-1]) {
                    this.move_block(x,y,x,y-1);
                    didSomething=1;
                }
            }
    } while (didSomething);

    do {
        didSomething = 0;
        for (var x=0; x<this.blocks.length-1; x++) {
            if (!this.blocks[x][9] && this.blocks[x+1][9]) {
                for (var y=0; y<this.blocks[x].length; y++)
                    this.move_block(x,y,x+1,y);
                didSomething = 1;
            }
	}
    } while (didSomething);
}
test.prototype.look_for_holes = function() {
    var was_empty = false;
    var n_empty = 0;
    for (var x=0; x<this.blocks.length; x++) {
        var empty = true;
        for (var y=0; y<this.blocks[x].length; y++) {
            if (this.blocks[x][y]) {
                empty = false;
		n_empty++;
	    }
	}
	if (was_empty)
	    assertEq(empty, true);
        was_empty = empty;
    }
    assertEq(n_empty, 190);
}
new test();