import unittest from quread.layout_mapper import parse_layout_csv_text class LayoutMapperTest(unittest.TestCase): def test_parse_layout_csv_uses_uploaded_values_and_fallback(self): csv_text = "\n".join( [ "qubit,row,col", "0,1,1", "1,0,1", "1,1,0", "3,9,0", "bad,0,0", ] ) coords, meta = parse_layout_csv_text(csv_text, n_qubits=4, rows=2, cols=2) self.assertEqual(coords[0], (1, 1)) self.assertEqual(coords[1], (1, 0)) self.assertEqual(coords[2], (1, 0)) # fallback row-major self.assertEqual(coords[3], (1, 1)) # fallback row-major self.assertEqual(meta["source"], "uploaded") self.assertEqual(int(meta["parsed_rows"]), 5) self.assertEqual(int(meta["mapped"]), 2) self.assertEqual(int(meta["fallback"]), 2) self.assertEqual(int(meta["skipped"]), 2) self.assertEqual(int(meta["duplicates"]), 1) def test_parse_layout_csv_accepts_alias_headers(self): csv_text = "\n".join( [ "q,r,c", "0,1,1", ] ) coords, meta = parse_layout_csv_text(csv_text, n_qubits=2, rows=2, cols=2) self.assertEqual(coords[0], (1, 1)) self.assertEqual(meta["source"], "uploaded") self.assertEqual(int(meta["mapped"]), 1) def test_empty_layout_csv_returns_default_mapping(self): coords, meta = parse_layout_csv_text("", n_qubits=3, rows=2, cols=2) self.assertEqual(meta["source"], "default") self.assertEqual(int(meta["mapped"]), 3) self.assertEqual(coords[0], (0, 0)) self.assertEqual(coords[1], (0, 1)) self.assertEqual(coords[2], (1, 0)) if __name__ == "__main__": unittest.main()