suite.test("isEqualTo", () => { // Trivial case: assertThat(GateColumn.empty(1)).isEqualTo(GateColumn.empty(1)); assertThat(GateColumn.empty(2)).isNotEqualTo(GateColumn.empty(1)); // Equivalence groups: let groups = [ [GateColumn.empty(0), GateColumn.empty(0), new GateColumn([]), new GateColumn([])], [GateColumn.empty(1), GateColumn.empty(1), new GateColumn([null]), new GateColumn([null])], [GateColumn.empty(2), GateColumn.empty(2), new GateColumn([null, null]), new GateColumn([null, null])], [new GateColumn([Gates.HalfTurns.X]), new GateColumn([Gates.HalfTurns.X])], [new GateColumn([Gates.Special.Control]), new GateColumn([Gates.Special.Control])], [new GateColumn([Gates.HalfTurns.X, null]), new GateColumn([Gates.HalfTurns.X, null])], [new GateColumn([null, Gates.HalfTurns.X]), new GateColumn([null, Gates.HalfTurns.X])] ]; for (let g1 of groups) { for (let g2 of groups) { for (let e1 of g1) { for (let e2 of g2) { if (g1 === g2) { assertThat(e1).isEqualTo(e2); assertTrue(e1.isEqualTo(e2)); } else { assertThat(e1).isNotEqualTo(e2); assertFalse(e1.isEqualTo(e2)); } } } } } });
suite.test("isEmpty", () => { assertTrue(GateColumn.empty(0).isEmpty()); assertTrue(GateColumn.empty(1).isEmpty()); assertTrue(GateColumn.empty(2).isEmpty()); assertTrue(GateColumn.empty(10).isEmpty()); assertTrue(new GateColumn([]).isEmpty()); assertTrue(new GateColumn([null]).isEmpty()); assertTrue(new GateColumn([null, null]).isEmpty()); assertFalse(new GateColumn([Gates.Special.Control]).isEmpty()); assertFalse(new GateColumn([Gates.Special.SwapHalf]).isEmpty()); assertFalse(new GateColumn([Gates.HalfTurns.X]).isEmpty()); assertFalse(new GateColumn([Gates.HalfTurns.X, null]).isEmpty()); assertFalse(new GateColumn([Gates.HalfTurns.X, Gates.HalfTurns.X]).isEmpty()); });
/** * @param {!Hand} hand * @returns {!DisplayedCircuit} * @private */ _previewDropMovedGate(hand) { let modificationPoint = this.findModificationIndex(hand); if (modificationPoint === undefined) { return this; } let handRowOffset = Math.floor(hand.holdOffset.y/Config.WIRE_SPACING); if (modificationPoint.row + handRowOffset >= this.circuitDefinition.numWires) { return this; } let addedGate = hand.heldGate; let emptyCol = GateColumn.empty(this.circuitDefinition.numWires); let i = modificationPoint.col; let isInserting = modificationPoint.isInsert; let row = Math.min(modificationPoint.row, Math.max(0, Config.MAX_WIRE_COUNT - addedGate.height)); let newCols = seq(this.circuitDefinition.columns). padded(i, emptyCol). ifThen(isInserting, s => s.withInsertedItem(i, emptyCol)). padded(i + addedGate.width, emptyCol). withTransformedItem(i, c => c.withGatesAdded(row, new GateColumn([addedGate]))). toArray(); let newWireCount = Math.max( this._extraWireStartIndex || 0, Math.max( this.circuitDefinition.numWires, addedGate.height + row)); if (newWireCount > Config.MAX_WIRE_COUNT) { return this; } return this.withCircuit(this.circuitDefinition.withColumns(newCols).withWireCount(newWireCount)). _withHighlightedSlot({row, col: modificationPoint.col, resizeStyle: false}). _withCompressedColumnIndex(isInserting ? i : undefined). _withFallbackExtraWireStartIndex(this.circuitDefinition.numWires); }
/** * @param {!Hand} hand * @returns {!DisplayedCircuit} * @private */ _previewDropMovedGate(hand) { let modificationPoint = this.findModificationIndex(hand); if (modificationPoint === undefined || modificationPoint.row + hand.heldGate.height > this.circuitDefinition.numWires) { return this; } let addedGate = hand.heldGate; let emptyCol = GateColumn.empty(this.circuitDefinition.numWires); let i = modificationPoint.col; let isInserting = modificationPoint.isInsert; let row = modificationPoint.row; let newCols = seq(this.circuitDefinition.columns). padded(i, emptyCol). ifThen(isInserting, s => s.withInsertedItem(i, emptyCol)). padded(i + addedGate.width, emptyCol). withTransformedItem(i, c => c.withGatesAdded(row, new GateColumn([addedGate]))). toArray(); return this.withCircuit(this.circuitDefinition.withColumns(newCols)). _withHighlightedSlot({row: modificationPoint.row, col: modificationPoint.col, resizeStyle: false}). _withCompressedColumnIndex(isInserting ? i : undefined); }
/** * @returns {!CircuitDefinition} */ withWidthOverlapsFixed() { let newCols = []; for (let col = 0; col < this.columns.length; col++) { let paddingRequired = Seq.range(this.numWires).map(row => { let gate = this.columns[col].gates[row]; if (gate === null) { return 0; } let f = this._findWidthWiseOverlapInRect(col, row, gate.width, gate.height); if (f === undefined) { return 0; } return gate.width - (f.col - col); }).max(0); newCols.push(this.columns[col]); for (let i = 0; i < paddingRequired; i++) { newCols.push(GateColumn.empty(this.numWires)); } } return this.withColumns(newCols); }
/** * @returns {!CircuitDefinition} */ withTrailingSpacersIncluded() { return this.withColumns(seq(this.columns). padded(this.minimumRequiredColCount(), GateColumn.empty(this.numWires)). toArray()); }