@@ -1881,6 +1881,63 @@ def test_init(self):
18811881 self .assertRaises (TypeError , Counter , (), ())
18821882 self .assertRaises (TypeError , Counter .__init__ )
18831883
1884+ def test_order_preservation (self ):
1885+ # Input order dictates items() order
1886+ self .assertEqual (list (Counter ('abracadabra' ).items ()),
1887+ [('a' , 5 ), ('b' , 2 ), ('r' , 2 ), ('c' , 1 ), ('d' , 1 )])
1888+ # letters with same count: ^----------^ ^---------^
1889+
1890+ # Verify retention of order even when all counts are equal
1891+ self .assertEqual (list (Counter ('xyzpdqqdpzyx' ).items ()),
1892+ [('x' , 2 ), ('y' , 2 ), ('z' , 2 ), ('p' , 2 ), ('d' , 2 ), ('q' , 2 )])
1893+
1894+ # Input order dictates elements() order
1895+ self .assertEqual (list (Counter ('abracadabra simsalabim' ).elements ()),
1896+ ['a' , 'a' , 'a' , 'a' , 'a' , 'a' , 'a' , 'b' , 'b' , 'b' ,'r' ,
1897+ 'r' , 'c' , 'd' , ' ' , 's' , 's' , 'i' , 'i' , 'm' , 'm' , 'l' ])
1898+
1899+ # Math operations order first by the order encountered in the left
1900+ # operand and then by the order encounted in the right operand.
1901+ ps = 'aaabbcdddeefggghhijjjkkl'
1902+ qs = 'abbcccdeefffhkkllllmmnno'
1903+ order = {letter : i for i , letter in enumerate (dict .fromkeys (ps + qs ))}
1904+ def correctly_ordered (seq ):
1905+ 'Return true if the letters occur in the expected order'
1906+ positions = [order [letter ] for letter in seq ]
1907+ return positions == sorted (positions )
1908+
1909+ p , q = Counter (ps ), Counter (qs )
1910+ self .assertTrue (correctly_ordered (+ p ))
1911+ self .assertTrue (correctly_ordered (- p ))
1912+ self .assertTrue (correctly_ordered (p + q ))
1913+ self .assertTrue (correctly_ordered (p - q ))
1914+ self .assertTrue (correctly_ordered (p | q ))
1915+ self .assertTrue (correctly_ordered (p & q ))
1916+
1917+ p , q = Counter (ps ), Counter (qs )
1918+ p += q
1919+ self .assertTrue (correctly_ordered (p ))
1920+
1921+ p , q = Counter (ps ), Counter (qs )
1922+ p -= q
1923+ self .assertTrue (correctly_ordered (p ))
1924+
1925+ p , q = Counter (ps ), Counter (qs )
1926+ p |= q
1927+ self .assertTrue (correctly_ordered (p ))
1928+
1929+ p , q = Counter (ps ), Counter (qs )
1930+ p &= q
1931+ self .assertTrue (correctly_ordered (p ))
1932+
1933+ p , q = Counter (ps ), Counter (qs )
1934+ p .update (q )
1935+ self .assertTrue (correctly_ordered (p ))
1936+
1937+ p , q = Counter (ps ), Counter (qs )
1938+ p .subtract (q )
1939+ self .assertTrue (correctly_ordered (p ))
1940+
18841941 def test_update (self ):
18851942 c = Counter ()
18861943 c .update (self = 42 )
0 commit comments