def test_label_set():
    # Creating a LabelSet from an existing list
    s = LabelSet(['a', 'b', 'e'])

    # add()
    s.add('d')
    s.add('c')
    s.add('d')
    eq_(len(s), 5)
    eq_(s[3], 'd')
    eq_(s[4], 'c')

    # index, __contains__, __getitem__, __iter__
    eq_(s.index('b'), 1)
    assert_raises(KeyError, s.index, 'f')
    assert 'b' in s
    assert 'q' not in s
    eq_(s[2], 'e')
    with assert_raises(IndexError):
        s[6]
    eq_(list(s), ['a', 'b', 'e', 'd', 'c'])

    # Copying generates a distinct LabelSet; __eq__ works
    s_copy = s.copy()
    eq_(s, s_copy)
    s_copy.add('f')
    eq_(len(s.items), 5)
    eq_(len(s.indices), 5)

    # merged
    s1 = LabelSet(['f', 'b', 'g', 'c'])
    merged, indices = s.merge(s1)
    eq_(len(s), 5)
    eq_(merged, LabelSet(['a', 'b', 'e', 'd', 'c', 'f', 'g']))
    eq_(indices, [5, 1, 6, 4])
def test_assoc_constructor():
    # Make a nice, normal AssocSpace
    u = np.asarray([[0, 1, 0.6], [1, 0, 0.8]])
    sigma = np.asarray([0.5, 0.3, 0.2])
    labels = LabelSet(['A', 'B'])
    assoc = AssocSpace(u, sigma, labels)
    eq_(assoc.k, 3)
    assert 'assoc' not in assoc.__dict__

    # Test some error conditions
    with assert_raises(ValueError):
        AssocSpace(u, np.asarray([0.0, -0.2, -0.4]), labels)
    with assert_raises(ValueError):
        AssocSpace(u, np.asarray([0.6, 0.4]), labels)
    with assert_raises(ValueError):
        AssocSpace(u, np.asarray([0.6, 0.7, 0.2]), labels)

    # Test assoc hinting
    assoc_matrix = assoc.assoc.copy()
    assoc_hinted = AssocSpace(u, sigma, labels, assoc=assoc_matrix)
    assert np.allclose(assoc_hinted.row_named('A'), assoc.row_named('A'))