Code coverage report for lib/fischerandom.js

Statements: 100% (68 / 68)      Branches: 93.75% (15 / 16)      Functions: 100% (13 / 13)      Lines: 100% (68 / 68)      Ignored: none     

All files » lib/ » fischerandom.js
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  1   1196     1000     1       1         1             1 1 1 1       1 1 1195 1195 1195 1195 1195     1 1000 1000 1000 1000 1000     1 1 3195 3195 3195 3195 3195 3195 3195 3195 3195 3195 3195 3195 3195 3195 3195   1 2195 17560 17560     1 1195 1195 1195 1195 9560 9560     9560 9560         1 5585   1 3195   1 19170   153360 153360 86265   67095 19170       1 12780   1 2195    
"use strict";
Object.defineProperties(exports, {
  fischerandom: {get: function() {
      return fischerandom;
    }},
  doubleFischerandom: {get: function() {
      return doubleFischerandom;
    }},
  ninesixty: {get: function() {
      return ninesixty;
    }},
  __esModule: {value: true}
});
var $__0 = require('./brands'),
    WHITE = $__0.WHITE,
    BLACK = $__0.BLACK,
    DARK = $__0.DARK,
    LIGHT = $__0.LIGHT;
var $__1 = require('./standard'),
    King = $__1.King,
    Queen = $__1.Queen,
    Rook = $__1.Rook,
    Bishop = $__1.Bishop,
    Knight = $__1.Knight,
    Pawn = $__1.Pawn;
var Point = require('./point').Point;
var Board = require('./board').Board;
var FEN = require('./fen').FEN;
var $__5 = require('./util'),
    isEven = $__5.isEven,
    isOdd = $__5.isOdd,
    oppositeColor = $__5.oppositeColor;
var Die = require('jsdice');
function fischerandom() {
  var board = new Board();
  randomizeSide(board);
  copySide(board);
  placePawns(board);
  return position(board);
}
;
function doubleFischerandom() {
  var board = new Board();
  randomizeSide(board, WHITE);
  randomizeSide(board, BLACK);
  placePawns(board);
  return position(board);
}
;
var ninesixty = fischerandom;
function randomizeSide(board) {
  var color = arguments[1] !== (void 0) ? arguments[1] : WHITE;
  var rank = colorRank(color);
  var place = placeOnEmptySquare.bind(null, rank, board);
  var b1 = rollDie('d8');
  board.placePiece(new Bishop({color: color}), new Point(b1, rank));
  var b2 = rollDie('d4');
  var b2Prime = colorClash(b1, b2) ? b2 + 1 : b2;
  board.placePiece(new Bishop({color: color}), new Point(b2Prime, rank));
  place(new Queen({color: color}), rollDie('d6'));
  var n = rollDie('d20');
  place(new Knight({color: color}), Math.floor(n / 4));
  place(new Knight({color: color}), n % 4);
  place(new Rook({color: color}), 0);
  place(new King({color: color}), 0);
  place(new Rook({color: color}), 0);
}
function placePawns(board) {
  for (var j = 0; j < board.files; j++) {
    board.placePiece(new Pawn({color: WHITE}), new Point(j, 6));
    board.placePiece(new Pawn({color: BLACK}), new Point(j, 1));
  }
}
function copySide(board) {
  var color = arguments[1] !== (void 0) ? arguments[1] : BLACK;
  var rank = colorRank(color);
  var oppRank = colorRank(oppositeColor(color));
  for (var j = 0; j < board.files; j++) {
    try {
      throw undefined;
    } catch (Brand) {
      {
        Brand = $traceurRuntime.assertObject(board.getPieceByCoords(new Point(j, oppRank))).constructor;
        board.placePiece(new Brand({color: color}), new Point(j, rank));
      }
    }
  }
}
function colorRank(color) {
  return color === WHITE ? 7 : 0;
}
function colorClash(a, b) {
  return ((isEven(a) && isEven(b)) || (isOdd(a) && isOdd(b)));
}
function placeOnEmptySquare(rank, board, piece, n) {
  for (var j = 0,
      count = 0; j < board.files; j++) {
    var point = new Point(j, rank);
    if (board.getPieceByCoords(point) != null) {
      continue;
    }
    if (n === count++) {
      board.placePiece(piece, point);
    }
  }
}
function rollDie(signature) {
  return new Die(signature).roll().total - 1;
}
function position(board) {
  return FEN.standardPosition.beget({board: board});
}