Revision 4a3dd52d

b/lib/compat.py
146 146
  else:
147 147
    return val
148 148

  
149

  
150
def UniqueFrozenset(seq):
151
  """Makes C{frozenset} from sequence after checking for duplicate elements.
152

  
153
  @raise ValueError: When there are duplicate elements
154

  
155
  """
156
  if isinstance(seq, (list, tuple)):
157
    items = seq
158
  else:
159
    items = list(seq)
160

  
161
  result = frozenset(items)
162

  
163
  if len(items) != len(result):
164
    raise ValueError("Duplicate values found")
165

  
166
  return result
167

  
168

  
149 169
#: returns the first element of a list-like value
150 170
fst = operator.itemgetter(0)
151 171

  
b/test/ganeti.compat_unittest.py
99 99
    self.assertEquals(compat.TryToRoman("19", convert=False), "19")
100 100

  
101 101

  
102
class TestUniqueFrozenset(unittest.TestCase):
103
  def testDuplicates(self):
104
    for values in [["", ""], ["Hello", "World", "Hello"]]:
105
      self.assertRaises(ValueError, compat.UniqueFrozenset, values)
106

  
107
  def testEmpty(self):
108
    self.assertEqual(compat.UniqueFrozenset([]), frozenset([]))
109

  
110
  def testUnique(self):
111
    self.assertEqual(compat.UniqueFrozenset([1, 2, 3]), frozenset([1, 2, 3]))
112

  
113
  def testGenerator(self):
114
    seq = ("Foo%s" % i for i in range(10))
115
    self.assertTrue(callable(seq.next))
116
    self.assertFalse(isinstance(seq, (list, tuple)))
117
    self.assertEqual(compat.UniqueFrozenset(seq),
118
                     frozenset(["Foo%s" % i for i in range(10)]))
119

  
120

  
102 121
if __name__ == "__main__":
103 122
  testutils.GanetiTestProgram()

Also available in: Unified diff