@@ -0,0 +1,1244 @@
+# -*- coding: utf-8 -*-%0A# Licensed under a 3-clause BSD style license - see LICENSE.rst%0A%0A# TEST_UNICODE_LITERALS%0A%0Afrom ... import table%0A%0A%0Aclass MyRow(table.Row):%0A    def __str__(self):%0A        return str(self.data)%0A%0A%0Aclass MyColumn(table.Column):%0A    def cool(self):%0A        return 'Cool!'%0A%0A%0Aclass MyMaskedColumn(table.Column):%0A    def cool(self):%0A        return 'MaskedCool!'%0A%0A%0Aclass MyTableColumns(table.TableColumns):%0A    def cool(self):%0A        return 'CoolTableColumns!'%0A%0A%0Aclass MyTable(table.Table):%0A    _Row = MyRow%0A    _Column = MyColumn%0A    _MaskedColumn = MyMaskedColumn%0A    _TableColumns = MyTableColumns%0A%0A%0Adef test_simple_subclass():%0A    t = MyTable(%5B%5B1, 2%5D, %5B3, 4%5D%5D)%0A    row = t%5B0%5D%0A    assert isinstance(row, MyRow)%0A    assert str(row) == '(1, 3)'%0A    assert t%5B'col0'%5D.cool() == 'Cool!'%0A    assert t.columns.cool() == 'CoolTableColumns!'%0A%0A    t2 = MyTable(t)%0A    row = t2%5B0%5D%0A    assert isinstance(row, MyRow)%0A    assert str(row) == '(1, 3)'%0A%0A    t3 = table.Table(t)%0A    row = t3%5B0%5D%0A    assert not isinstance(row, MyRow)%0A    assert str(row) != '(1, 3)'%0A%0A    t = MyTable(%5B%5B1, 2%5D, %5B3, 4%5D%5D, masked=True)%0A    row = t%5B0%5D%0A    assert isinstance(row, MyRow)%0A    assert str(row) == '(1, 3)'%0A    assert t%5B'col0'%5D.cool() == 'MaskedCool!'%0A    %0A

Add initial tests of subclassing components