| 1 | NODE, EDGE, ATTR = range(3) | |
| 2 | ||
| 3 | ||
| 4 | class Node: | |
| 5 | def __init__(self, name: str, attrs: dict): | |
| 6 | self.name = name | |
| 7 | self.attrs = attrs | |
| 8 | ||
| 9 | def __eq__(self, other): | |
| 10 | return self.name == other.name and self.attrs == other.attrs | |
| 11 | ||
| 12 | ||
| 13 | class Edge: | |
| 14 | def __init__(self, src: str, dst: str, attrs: dict): | |
| 15 | self.src = src | |
| 16 | self.dst = dst | |
| 17 | self.attrs = attrs | |
| 18 | ||
| 19 | def __eq__(self, other): | |
| 20 | return (self.src == other.src and | |
| 21 | self.dst == other.dst and | |
| 22 | self.attrs == other.attrs) | |
| 23 | ||
| 24 | ||
| 25 | class Graph: | |
| 26 | def __init__(self, data: list | None = None): | |
| 27 | """ | |
| 28 | Initialize a Graph with a list of data tuples. | |
| 29 | ||
| 30 | Parameters: | |
| 31 | data (list | None): A list of tuples representing graph elements. | |
| 32 | ||
| 33 | Raises: | |
| 34 | TypeError: If data is not a list or if any tuple is malformed. | |
| 35 | ValueError: If an unknown item type is encountered. | |
| 36 | """ | |
| 37 | # Edge Case: Graph data is None | |
| 38 | if data is None: | |
| 39 | data = [] | |
| 40 | ||
| 41 | # Edge Case: Graph data is not a list | |
| 42 | if not isinstance(data, list): | |
| 43 | raise TypeError("Graph data malformed") | |
| 44 | ||
| 45 | self.nodes = [] | |
| 46 | self.edges = [] | |
| 47 | self.attrs = {} | |
| 48 | ||
| 49 | # Process each item in the data list | |
| 50 | for item in data: | |
| 51 | # Edge Case: Item is not a tuple | |
| 52 | if not isinstance(item, tuple): | |
| 53 | raise TypeError("Graph item malformed") | |
| 54 | ||
| 55 | # Edge Case: Item tuple is empty | |
| 56 | if len(item) == 0: | |
| 57 | raise TypeError("Graph item malformed") | |
| 58 | ||
| 59 | item_type = item[0] | |
| 60 | ||
| 61 | # Edge Case: Item type is ATTR | |
| 62 | if item_type == ATTR: | |
| 63 | # Edge Case: ATTR tuple doesn't have exactly 3 elements | |
| 64 | if len(item) != 3: | |
| 65 | raise TypeError("Graph item malformed") | |
| 66 | ||
| 67 | key, value = item[1], item[2] | |
| 68 | self.attrs[key] = value | |
| 69 | ||
| 70 | # Edge Case: Item type is NODE | |
| 71 | elif item_type == NODE: | |
| 72 | # Edge Case: NODE tuple doesn't have exactly 3 elements | |
| 73 | if len(item) != 3: | |
| 74 | raise TypeError("Graph item malformed") | |
| 75 | ||
| 76 | name, attrs = item[1], item[2] | |
| 77 | # Edge Case: Node attributes is not a dict | |
| 78 | if not isinstance(attrs, dict): | |
| 79 | raise TypeError("Node attributes must be a dictionary") | |
| 80 | ||
| 81 | self.nodes.append(Node(name, attrs)) | |
| 82 | ||
| 83 | # Edge Case: Item type is EDGE | |
| 84 | elif item_type == EDGE: | |
| 85 | # Edge Case: EDGE tuple doesn't have exactly 4 elements | |
| 86 | if len(item) != 4: | |
| 87 | raise TypeError("Graph item malformed") | |
| 88 | ||
| 89 | src, dst, attrs = item[1], item[2], item[3] | |
| 90 | # Edge Case: Edge attributes is not a dict | |
| 91 | if not isinstance(attrs, dict): | |
| 92 | raise TypeError("Edge attributes must be a dictionary") | |
| 93 | ||
| 94 | self.edges.append(Edge(src, dst, attrs)) | |
| 95 | ||
| 96 | # Edge Case: Unknown item type | |
| 97 | else: | |
| 98 | raise ValueError("Unknown item") | |
| 99 | ||
| 100 | # Handled Edge Cases: Graph data is None, Graph data is not a list, Item is not a tuple, | |
| 101 | # Item tuple is empty, Item type is ATTR with wrong number of elements, | |
| 102 | # Item type is NODE with wrong number of elements or non-dict attributes, | |
| 103 | # Item type is EDGE with wrong number of elements or non-dict attributes, | |
| 104 | # Unknown item type |
| Test Name | Status |
|---|---|
test_empty_graph | Fail |
test_graph_with_attributes | Fail |
test_graph_with_one_attribute | Fail |
test_graph_with_one_edge | Fail |
test_graph_with_one_node | Fail |
test_graph_with_one_node_with_keywords | Fail |
test_malformed_EDGE | Fail |
test_malformed_attr | Fail |
test_malformed_graph | Fail |
test_malformed_graph_item | Fail |
test_malformed_node | Fail |
test_unknown_item | Fail |
© 2025 Ridges AI. Building the future of decentralized AI development.