def test_parse_not_supported_yet(): with pytest.raises(NotImplementedError, match='Custom gates not supported yet'): _ = quirk_url_to_circuit( 'http://algassert.com/quirk#circuit={"cols": [[]], "gates": []}') with pytest.raises(NotImplementedError, match='initial states not supported yet'): _ = quirk_url_to_circuit( 'http://algassert.com/quirk#circuit={"cols": [[]], "init": []}')
def test_parse_failures(): with pytest.raises(ValueError, match='must start with "circuit="'): _ = quirk_url_to_circuit('http://algassert.com/quirk#bad') with pytest.raises(json.JSONDecodeError): _ = quirk_url_to_circuit('http://algassert.com/quirk#circuit=') with pytest.raises(ValueError, match='top-level dictionary'): _ = quirk_url_to_circuit('http://algassert.com/quirk#circuit=[]') with pytest.raises(ValueError, match='"cols" entry'): _ = quirk_url_to_circuit('http://algassert.com/quirk#circuit={}') with pytest.raises(ValueError, match='cols must be a list'): _ = quirk_url_to_circuit( 'http://algassert.com/quirk#circuit={"cols": 1}') with pytest.raises(ValueError, match='col must be a list'): _ = quirk_url_to_circuit( 'http://algassert.com/quirk#circuit={"cols": [0]}') with pytest.raises(ValueError, match='Unrecognized column entry: 0'): _ = quirk_url_to_circuit( 'http://algassert.com/quirk#circuit={"cols": [[0]]}') with pytest.raises(ValueError, match='Unrecognized column entry: '): _ = quirk_url_to_circuit( 'http://algassert.com/quirk#circuit={"cols": [["not a real"]]}') with pytest.raises(ValueError, match='Unrecognized Circuit JSON keys'): _ = quirk_url_to_circuit( 'http://algassert.com/quirk#circuit={"cols": [[]], "other": 1}')
def test_parse_simple_cases(): a, b = cirq.LineQubit.range(2) assert quirk_url_to_circuit('http://algassert.com/quirk') == cirq.Circuit() assert quirk_url_to_circuit('https://algassert.com/quirk') == cirq.Circuit() assert quirk_url_to_circuit( 'https://algassert.com/quirk#') == cirq.Circuit() assert quirk_url_to_circuit( 'http://algassert.com/quirk#circuit={"cols":[]}') == cirq.Circuit() assert quirk_url_to_circuit( 'https://algassert.com/quirk#circuit={' '%22cols%22:[[%22H%22],[%22%E2%80%A2%22,%22X%22]]' '}') == cirq.Circuit(cirq.H(a), cirq.X(b).controlled_by(a))
def test_custom_gate_parse_failures(): with pytest.raises(ValueError, match='must be a list'): _ = quirk_url_to_circuit( 'https://algassert.com/quirk#circuit={"cols":[],' '"gates":5}') with pytest.raises(ValueError, match='gate json must be a dict'): _ = quirk_url_to_circuit( 'https://algassert.com/quirk#circuit={"cols":[],' '"gates":[5]}') with pytest.raises(ValueError, match='Circuit JSON must be a dict'): _ = quirk_url_to_circuit( 'https://algassert.com/quirk#circuit={"cols":[],' '"gates":[{"id":"~a","circuit":5}]}') with pytest.raises(ValueError, match='matrix json must be a string'): _ = quirk_url_to_circuit( 'https://algassert.com/quirk#circuit={"cols":[],' '"gates":[{"id":"~a","matrix":5}]}') with pytest.raises(ValueError, match='Not surrounded by {{}}'): _ = quirk_url_to_circuit( 'https://algassert.com/quirk#circuit={"cols":[],' '"gates":[{"id":"~a","matrix":"abc"}]}') with pytest.raises(ValueError, match='must have an id'): _ = quirk_url_to_circuit( 'https://algassert.com/quirk#circuit={"cols":[],' '"gates":[' '{"matrix":"{{1,0},{0,1}}"}' ']}') with pytest.raises(ValueError, match='both a matrix and a circuit'): _ = quirk_url_to_circuit( 'https://algassert.com/quirk#circuit={"cols":[],' '"gates":[' '{"id":"~a","circuit":{"cols":[]},"matrix":"{{1,0},{0,1}}"}' ']}') with pytest.raises(ValueError, match='matrix or a circuit'): _ = quirk_url_to_circuit( 'https://algassert.com/quirk#circuit={"cols":[],' '"gates":[' '{"id":"~a"}' ']}') with pytest.raises(ValueError, match='duplicate identifier'): _ = quirk_url_to_circuit( 'https://algassert.com/quirk#circuit={"cols":[],' '"gates":[' '{"id":"~a","matrix":"{{1,0},{0,1}}"},' '{"id":"~a","matrix":"{{1,0},{0,1}}"}]}')
def test_parse_failures(url, msg): parsed_url = urllib.parse.urlparse(url) data = json.loads(parsed_url.fragment[len('circuit='):]) with pytest.raises(ValueError, match=msg): _ = quirk_url_to_circuit(url) with pytest.raises(ValueError, match=msg): _ = quirk_json_to_circuit(data)
def test_parse_with_qubits(): a = cirq.GridQubit(0, 0) b = cirq.GridQubit(0, 1) c = cirq.GridQubit(0, 2) assert quirk_url_to_circuit( 'http://algassert.com/quirk#circuit={"cols":[["H"],["•","X"]]}', qubits=cirq.GridQubit.rect(4, 4)) == cirq.Circuit( cirq.H(a), cirq.X(b).controlled_by(a)) assert quirk_url_to_circuit( 'http://algassert.com/quirk#circuit={"cols":[["H"],["•",1,"X"]]}', qubits=cirq.GridQubit.rect(4, 4)) == cirq.Circuit( cirq.H(a), cirq.X(c).controlled_by(a)) with pytest.raises(IndexError, match="qubits specified"): _ = quirk_url_to_circuit( 'http://algassert.com/quirk#circuit={"cols":[["H"],["•","X"]]}', qubits=[cirq.GridQubit(0, 0)])
def test_input_cell(): assert_url_to_circuit_returns('{"cols":[["inputA4",1,1,1,"+=A4"]]}', maps={ 0x_0_0: 0x_0_0, 0x_2_3: 0x_2_5, }) assert_url_to_circuit_returns( '{"cols":[["inputA3",1,1,"inputB3",1,1,"+=AB3"]]}', maps={ 0o_0_0_0: 0o_0_0_0, 0o_2_3_1: 0o_2_3_7, 0o_1_1_0: 0o_1_1_1, 0o_4_4_0: 0o_4_4_0, }) # Overlaps with effect. with pytest.raises(ValueError, match='Overlapping registers'): _ = quirk_url_to_circuit('https://algassert.com/quirk#circuit={"cols":[' '["+=A3","inputA3"]]}')
def test_set_default_input_cell(): # Later column. assert_url_to_circuit_returns( '{"cols":[[{"id":"setA","arg":11}],["+=A4"]]}', maps={ 0: 11, 4: 15, 5: 0, }) # Same column. assert_url_to_circuit_returns('{"cols":[["+=A4",{"id":"setA","arg":11}]]}', maps={ 0: 11, 4: 15, 5: 0, }) # Overwrite. assert_url_to_circuit_returns( '{"cols":[[{"id":"setA","arg":0}],["+=A4",{"id":"setA","arg":11}]]}', maps={ 0: 11, 4: 15, 5: 0, }) assert_url_to_circuit_returns( '{"cols":[[{"id":"setA","arg":11}],["+=A4",{"id":"setA","arg":0}]]}', maps={ 0: 0, 4: 4, 5: 5, }) # Different values over time. assert_url_to_circuit_returns( '{"cols":[' '[{"id":"setA","arg":1}],' '["+=A4"],' '[{"id":"setA","arg":4}],' '["+=A4"]]}', maps={ 0: 5, }) # Broadcast. assert_url_to_circuit_returns( '{"cols":[' '[{"id":"setA","arg":1}],' '["+=A2",1,"+=A2"],' '["+=A2",1,"+=A2"]]}', maps={ 0b_00_00: 0b_10_10, 0b_10_01: 0b_00_11, }) # Too late. with pytest.raises(ValueError, match='Missing input'): _ = quirk_url_to_circuit( 'https://algassert.com/quirk#circuit={"cols":[' '["+=A2"],' '[{"id":"setA","arg":1}]]}')
def test_missing_input_cell(): with pytest.raises(ValueError, match='Missing input'): _ = quirk_url_to_circuit( 'https://algassert.com/quirk#circuit={"cols":[' '["+=A2"]]}')
def test_parse_url_failures(url, error_cls, msg): with pytest.raises(error_cls, match=msg): _ = quirk_url_to_circuit(url)