|
4 | 4 | from pandas.compat import range, lrange, lzip, u, zip
|
5 | 5 | import operator
|
6 | 6 | import pickle
|
| 7 | +import re |
7 | 8 | import unittest
|
8 | 9 | import nose
|
9 | 10 | import os
|
@@ -44,10 +45,35 @@ def test_wrong_number_names(self):
|
44 | 45 | def testit(ind):
|
45 | 46 | ind.names = ["apple", "banana", "carrot"]
|
46 | 47 |
|
47 |
| - indices = (self.dateIndex, self.unicodeIndex, self.strIndex, self.intIndex, self.floatIndex, self.empty, self.tuples) |
| 48 | + indices = (self.dateIndex, self.unicodeIndex, self.strIndex, |
| 49 | + self.intIndex, self.floatIndex, self.empty, self.tuples) |
48 | 50 | for ind in indices:
|
49 | 51 | assertRaisesRegexp(ValueError, "^Length", testit, ind)
|
50 | 52 |
|
| 53 | + def test_set_name_methods(self): |
| 54 | + new_name = "This is the new name for this index" |
| 55 | + indices = (self.dateIndex, self.intIndex, self.unicodeIndex, |
| 56 | + self.empty) |
| 57 | + for ind in indices: |
| 58 | + original_name = ind.name |
| 59 | + new_ind = ind.set_names([new_name]) |
| 60 | + self.assertEqual(new_ind.name, new_name) |
| 61 | + self.assertEqual(ind.name, original_name) |
| 62 | + res = ind.rename(new_name, inplace=True) |
| 63 | + # should return None |
| 64 | + self.assert_(res is None) |
| 65 | + self.assertEqual(ind.name, new_name) |
| 66 | + self.assertEqual(ind.names, [new_name]) |
| 67 | + with assertRaisesRegexp(TypeError, "list-like"): |
| 68 | + # should still fail even if it would be the right length |
| 69 | + ind.set_names("a") |
| 70 | + # rename in place just leaves tuples and other containers alone |
| 71 | + name = ('A', 'B') |
| 72 | + ind = self.intIndex |
| 73 | + ind.rename(name, inplace=True) |
| 74 | + self.assertEqual(ind.name, name) |
| 75 | + self.assertEqual(ind.names, [name]) |
| 76 | + |
51 | 77 | def test_hash_error(self):
|
52 | 78 | self.assertRaises(TypeError, hash, self.strIndex)
|
53 | 79 |
|
@@ -1018,6 +1044,48 @@ def setUp(self):
|
1018 | 1044 | labels=[major_labels, minor_labels],
|
1019 | 1045 | names=self.index_names)
|
1020 | 1046 |
|
| 1047 | + def test_set_names_and_rename(self): |
| 1048 | + # so long as these are synonyms, we don't need to test set_names |
| 1049 | + self.assert_(self.index.rename == self.index.set_names) |
| 1050 | + new_names = [name + "SUFFIX" for name in self.index_names] |
| 1051 | + ind = self.index.set_names(new_names) |
| 1052 | + self.assertEqual(self.index.names, self.index_names) |
| 1053 | + self.assertEqual(ind.names, new_names) |
| 1054 | + with assertRaisesRegexp(ValueError, "^Length"): |
| 1055 | + ind.set_names(new_names + new_names) |
| 1056 | + new_names2 = [name + "SUFFIX2" for name in new_names] |
| 1057 | + res = ind.set_names(new_names2, inplace=True) |
| 1058 | + self.assert_(res is None) |
| 1059 | + self.assertEqual(ind.names, new_names2) |
| 1060 | + |
| 1061 | + def test_set_levels_and_set_labels(self): |
| 1062 | + # side note - you probably wouldn't want to use levels and labels |
| 1063 | + # directly like this - but it is possible. |
| 1064 | + levels, labels = self.index.levels, self.index.labels |
| 1065 | + new_levels = [[lev + 'a' for lev in level] for level in levels] |
| 1066 | + major_labels, minor_labels = labels |
| 1067 | + major_labels = [(x + 1) % 3 for x in major_labels] |
| 1068 | + minor_labels = [(x + 1) % 1 for x in minor_labels] |
| 1069 | + new_labels = [major_labels, minor_labels] |
| 1070 | + |
| 1071 | + def test_metadata_immutable(self): |
| 1072 | + levels, labels = self.index.levels, self.index.labels |
| 1073 | + # shouldn't be able to set at either the top level or base level |
| 1074 | + mutable_regex = re.compile('does not support mutable operations') |
| 1075 | + with assertRaisesRegexp(TypeError, mutable_regex): |
| 1076 | + levels[0] = levels[0] |
| 1077 | + with assertRaisesRegexp(TypeError, mutable_regex): |
| 1078 | + levels[0][0] = levels[0][0] |
| 1079 | + # ditto for labels |
| 1080 | + with assertRaisesRegexp(TypeError, mutable_regex): |
| 1081 | + labels[0] = labels[0] |
| 1082 | + with assertRaisesRegexp(TypeError, mutable_regex): |
| 1083 | + labels[0][0] = labels[0][0] |
| 1084 | + # and for names |
| 1085 | + names = self.index.names |
| 1086 | + with assertRaisesRegexp(TypeError, mutable_regex): |
| 1087 | + names[0] = names[0] |
| 1088 | + |
1021 | 1089 | def test_copy_in_constructor(self):
|
1022 | 1090 | levels = np.array(["a", "b", "c"])
|
1023 | 1091 | labels = np.array([1, 1, 2, 0, 0, 1, 1])
|
|
0 commit comments