def test_add_symbol(): ST = SymbolTable("") T = FastRBTree() Content = {'Type': "int" , 'Attribute': None , 'TokenLocation': (10,2) } ST.InsertSymbol("age", Content) T.insert("age", Content) Content = {'Type': "float" , 'Attribute': 'static' , 'TokenLocation': (11,2) } ST.InsertSymbol("temperature", Content) T.insert("temperature", Content) Content = {'Type': "char" , 'Attribute': 'const' , 'TokenLocation': (12,2) } ST.InsertSymbol("letter", Content) T.insert("letter", Content) keys = ST.TopScope.keys() for key in keys: assert(T.__contains__(key)) assert(T.get(key) == ST.TopScope.get(key)) assert(T.get(key) is not ST.TopScope.get(key)) #write test to prove that the returned item is a pointer return
class TradeTree(object): '''A red-black tree used to store TradeLists in price trade The exchange will be using the TradeTree to hold bid and ask data (one TradeTree for each side). Keeping the information in a red black tree makes it easier/faster to detect a match. ''' def __init__(self): self.price_tree = FastRBTree() self.trade_map = {} self.num_trades = 0 # Contains count of Orders in tree self.depth = 0 # Number of different prices in tree (http://en.wikipedia.org/wiki/trade_book_(trading)#Book_depth) def __len__(self): return len(self.trade_map) def get_price_list(self, price): return self.price_tree.get(price, []) def get_trade(self, trade_id): return self.trade_map[trade_id] if trade_id in self.trade_map else None def create_price(self, price): self.depth += 1 # Add a price depth level to the tree new_list = LinkedList() self.price_tree.insert(price, new_list) # Insert a new price into the tree def remove_price(self, price): self.depth -= 1 # Remove a price depth level self.price_tree.remove(price) def price_exists(self, price): return self.price_tree.__contains__(price) def trade_exists(self, trade_id): return trade_id in self.trade_map def insert_trade(self, xtrade): if self.trade_exists(xtrade.id): return self.num_trades += 1 if not self.price_exists(xtrade.limit_price): self.create_price( xtrade.limit_price ) # If price not in Price Map, create a node in RBtree self.trade_map[ trade.id] = self.price_tree[xtrade.limit_price].append_item( xtrade ) # Add the trade to the TradeList in Price Map return the reference def remove_trade(self, xtrade): self.num_trades -= 1 trade_node = self.trade_map[trade.id] self.price_tree[trade.limit_price].remove_item(trade_node) if len(self.price_tree[trade.limit_price]) == 0: self.remove_price(trade.limit_price) self.trade_map.pop(trade.id, None) def max_price(self): if self.depth > 0: return self.price_tree.max_key() else: return None def min_price(self): if self.depth > 0: return self.price_tree.min_key() else: return None def max_price_list(self): if self.depth > 0: return self.get_price_list(self.max_price()) else: return None def min_price_list(self): if self.depth > 0: return self.get_price_list(self.min_price()) else: return None