go.charczuk.com@v0.0.0-20240327042549-bc490516bd1a/projects/nodes/pkg/types/table_test.go (about)

     1  /*
     2  
     3  Copyright (c) 2023 - Present. Will Charczuk. All rights reserved.
     4  Use of this source code is governed by a MIT license that can be found in the LICENSE file at the root of the repository.
     5  
     6  */
     7  
     8  package types
     9  
    10  import (
    11  	"testing"
    12  
    13  	"go.charczuk.com/sdk/assert"
    14  )
    15  
    16  func Test_Table_Set(t *testing.T) {
    17  	table := new(Table)
    18  	table.Columns = []TableColumn{
    19  		{Name: "0", Values: []any{"0-0", "0-1", "0-2"}},
    20  		{Name: "1", Values: []any{"1-0", "1-1", "1-2", "1-3"}},
    21  		{Name: "2", Values: []any{"2-0", "2-1", "2-2", "2-3", "2-3"}},
    22  	}
    23  	err := table.Set(0, 0, "new-0-0")
    24  	assert.ItsNil(t, err)
    25  	assert.ItsEqual(t, "new-0-0", table.Columns[0].Values[0])
    26  	assert.ItsEqual(t, "0-1", table.Columns[0].Values[1])
    27  	assert.ItsEqual(t, "0-2", table.Columns[0].Values[2])
    28  	assert.ItsEqual(t, "1-0", table.Columns[1].Values[0])
    29  	assert.ItsEqual(t, "2-0", table.Columns[2].Values[0])
    30  }
    31  
    32  func Test_Table_Set_addRows(t *testing.T) {
    33  	table := new(Table)
    34  	table.Columns = []TableColumn{
    35  		{Name: "0", Values: []any{"0-0", "0-1", "0-2"}},
    36  		{Name: "1", Values: []any{"1-0", "1-1", "1-2", "1-3"}},
    37  		{Name: "2", Values: []any{"2-0", "2-1", "2-2", "2-3", "2-3"}},
    38  	}
    39  	err := table.Set(5, 0, "new-0-5")
    40  	assert.ItsNil(t, err)
    41  	assert.ItsEqual(t, 6, len(table.Columns[0].Values))
    42  	assert.ItsEqual(t, "0-0", table.Columns[0].Values[0])
    43  	assert.ItsEqual(t, "0-1", table.Columns[0].Values[1])
    44  	assert.ItsEqual(t, "0-2", table.Columns[0].Values[2])
    45  	assert.ItsNil(t, table.Columns[0].Values[3])
    46  	assert.ItsNil(t, table.Columns[0].Values[4])
    47  	assert.ItsEqual(t, "new-0-5", table.Columns[0].Values[5])
    48  	assert.ItsEqual(t, "0-1", table.Columns[0].Values[1])
    49  	assert.ItsEqual(t, "0-2", table.Columns[0].Values[2])
    50  	assert.ItsEqual(t, "1-0", table.Columns[1].Values[0])
    51  	assert.ItsEqual(t, "2-0", table.Columns[2].Values[0])
    52  }
    53  
    54  func Test_Table_InsertColumn_invalid_before(t *testing.T) {
    55  	table := new(Table)
    56  	table.Columns = []TableColumn{
    57  		{Name: "0"},
    58  		{Name: "1"},
    59  		{Name: "2"},
    60  	}
    61  	err := table.InsertColumn(-1, TableColumn{Name: "New", ValueType: "string"})
    62  	assert.ItsNotNil(t, err)
    63  	assert.ItsEqual(t, "0", table.Columns[0].Name)
    64  	assert.ItsEqual(t, "1", table.Columns[1].Name)
    65  	assert.ItsEqual(t, "2", table.Columns[2].Name)
    66  }
    67  
    68  func Test_Table_InsertColumn_invalid_after(t *testing.T) {
    69  	table := new(Table)
    70  	table.Columns = []TableColumn{
    71  		{Name: "0"},
    72  		{Name: "1"},
    73  		{Name: "2"},
    74  	}
    75  	err := table.InsertColumn(4, TableColumn{Name: "New", ValueType: "string"})
    76  	assert.ItsNotNil(t, err)
    77  	assert.ItsEqual(t, "0", table.Columns[0].Name)
    78  	assert.ItsEqual(t, "1", table.Columns[1].Name)
    79  	assert.ItsEqual(t, "2", table.Columns[2].Name)
    80  }
    81  
    82  func Test_Table_InsertColumn_empty(t *testing.T) {
    83  	table := new(Table)
    84  	table.Columns = []TableColumn{}
    85  	err := table.InsertColumn(0, TableColumn{Name: "New", ValueType: "string"})
    86  	assert.ItsNil(t, err)
    87  	assert.ItsEqual(t, "New", table.Columns[0].Name)
    88  }
    89  
    90  func Test_Table_InsertColumn_zero(t *testing.T) {
    91  	table := new(Table)
    92  	table.Columns = []TableColumn{
    93  		{Name: "0"},
    94  		{Name: "1"},
    95  		{Name: "2"},
    96  	}
    97  	err := table.InsertColumn(0, TableColumn{Name: "New", ValueType: "string"})
    98  	assert.ItsNil(t, err)
    99  	assert.ItsEqual(t, "New", table.Columns[0].Name)
   100  	assert.ItsEqual(t, "0", table.Columns[1].Name)
   101  	assert.ItsEqual(t, "1", table.Columns[2].Name)
   102  	assert.ItsEqual(t, "2", table.Columns[3].Name)
   103  }
   104  
   105  func Test_Table_InsertColumn_mid(t *testing.T) {
   106  	table := new(Table)
   107  	table.Columns = []TableColumn{
   108  		{Name: "0"},
   109  		{Name: "1"},
   110  		{Name: "2"},
   111  	}
   112  	err := table.InsertColumn(1, TableColumn{Name: "New", ValueType: "string"})
   113  	assert.ItsNil(t, err)
   114  	assert.ItsEqual(t, "0", table.Columns[0].Name)
   115  	assert.ItsEqual(t, "New", table.Columns[1].Name)
   116  	assert.ItsEqual(t, "1", table.Columns[2].Name)
   117  	assert.ItsEqual(t, "2", table.Columns[3].Name)
   118  }
   119  
   120  func Test_Table_InsertColumn_mid2(t *testing.T) {
   121  	table := new(Table)
   122  	table.Columns = []TableColumn{
   123  		{Name: "0"},
   124  		{Name: "1"},
   125  		{Name: "2"},
   126  	}
   127  	err := table.InsertColumn(2, TableColumn{Name: "New", ValueType: "string"})
   128  	assert.ItsNil(t, err)
   129  	assert.ItsEqual(t, "0", table.Columns[0].Name)
   130  	assert.ItsEqual(t, "1", table.Columns[1].Name)
   131  	assert.ItsEqual(t, "New", table.Columns[2].Name)
   132  	assert.ItsEqual(t, "2", table.Columns[3].Name)
   133  }
   134  
   135  func Test_Table_InsertColumn_end(t *testing.T) {
   136  	table := new(Table)
   137  	table.Columns = []TableColumn{
   138  		{Name: "0"},
   139  		{Name: "1"},
   140  		{Name: "2"},
   141  	}
   142  	err := table.InsertColumn(3, TableColumn{Name: "New", ValueType: "string"})
   143  	assert.ItsNil(t, err)
   144  	assert.ItsEqual(t, "0", table.Columns[0].Name)
   145  	assert.ItsEqual(t, "1", table.Columns[1].Name)
   146  	assert.ItsEqual(t, "2", table.Columns[2].Name)
   147  	assert.ItsEqual(t, "New", table.Columns[3].Name)
   148  }
   149  
   150  func Test_Table_ReorderColumn(t *testing.T) {
   151  	table := new(Table)
   152  	table.Columns = []TableColumn{
   153  		{Name: "0"},
   154  		{Name: "1"},
   155  		{Name: "2"},
   156  	}
   157  	err := table.ReorderColumn(0, 2)
   158  	assert.ItsNil(t, err)
   159  	assert.ItsEqual(t, "2", table.Columns[0].Name)
   160  	assert.ItsEqual(t, "1", table.Columns[1].Name)
   161  	assert.ItsEqual(t, "0", table.Columns[2].Name)
   162  }
   163  
   164  func Test_Table_ReorderColumn_invalid_before_old(t *testing.T) {
   165  	table := new(Table)
   166  	table.Columns = []TableColumn{
   167  		{Name: "0"},
   168  		{Name: "1"},
   169  		{Name: "2"},
   170  	}
   171  	err := table.ReorderColumn(-1, 2)
   172  	assert.ItsNotNil(t, err)
   173  	assert.ItsEqual(t, "0", table.Columns[0].Name)
   174  	assert.ItsEqual(t, "1", table.Columns[1].Name)
   175  	assert.ItsEqual(t, "2", table.Columns[2].Name)
   176  }
   177  
   178  func Test_Table_ReorderColumn_invalid_before_new(t *testing.T) {
   179  	table := new(Table)
   180  	table.Columns = []TableColumn{
   181  		{Name: "0"},
   182  		{Name: "1"},
   183  		{Name: "2"},
   184  	}
   185  	err := table.ReorderColumn(0, -2)
   186  	assert.ItsNotNil(t, err)
   187  	assert.ItsEqual(t, "0", table.Columns[0].Name)
   188  	assert.ItsEqual(t, "1", table.Columns[1].Name)
   189  	assert.ItsEqual(t, "2", table.Columns[2].Name)
   190  }
   191  
   192  func Test_Table_ReorderColumn_invalid_after_old(t *testing.T) {
   193  	table := new(Table)
   194  	table.Columns = []TableColumn{
   195  		{Name: "0"},
   196  		{Name: "1"},
   197  		{Name: "2"},
   198  	}
   199  	err := table.ReorderColumn(4, 2)
   200  	assert.ItsNotNil(t, err)
   201  	assert.ItsEqual(t, "0", table.Columns[0].Name)
   202  	assert.ItsEqual(t, "1", table.Columns[1].Name)
   203  	assert.ItsEqual(t, "2", table.Columns[2].Name)
   204  }
   205  
   206  func Test_Table_ReorderColumn_invalid_after_new(t *testing.T) {
   207  	table := new(Table)
   208  	table.Columns = []TableColumn{
   209  		{Name: "0"},
   210  		{Name: "1"},
   211  		{Name: "2"},
   212  	}
   213  	err := table.ReorderColumn(0, 4)
   214  	assert.ItsNotNil(t, err)
   215  	assert.ItsEqual(t, "0", table.Columns[0].Name)
   216  	assert.ItsEqual(t, "1", table.Columns[1].Name)
   217  	assert.ItsEqual(t, "2", table.Columns[2].Name)
   218  }
   219  
   220  func Test_Table_DeleteColumn_invalid_before(t *testing.T) {
   221  	table := new(Table)
   222  	table.Columns = []TableColumn{
   223  		{Name: "0"},
   224  		{Name: "1"},
   225  		{Name: "2"},
   226  	}
   227  	err := table.DeleteColumn(-1)
   228  	assert.ItsNotNil(t, err)
   229  	assert.ItsEqual(t, "0", table.Columns[0].Name)
   230  	assert.ItsEqual(t, "1", table.Columns[1].Name)
   231  	assert.ItsEqual(t, "2", table.Columns[2].Name)
   232  }
   233  
   234  func Test_Table_DeleteColumn_invalid_after(t *testing.T) {
   235  	table := new(Table)
   236  	table.Columns = []TableColumn{
   237  		{Name: "0"},
   238  		{Name: "1"},
   239  		{Name: "2"},
   240  	}
   241  	err := table.DeleteColumn(3)
   242  	assert.ItsNotNil(t, err)
   243  	assert.ItsEqual(t, "0", table.Columns[0].Name)
   244  	assert.ItsEqual(t, "1", table.Columns[1].Name)
   245  	assert.ItsEqual(t, "2", table.Columns[2].Name)
   246  }
   247  
   248  func Test_Table_DeleteColumn_zero(t *testing.T) {
   249  	table := new(Table)
   250  	table.Columns = []TableColumn{
   251  		{Name: "0"},
   252  		{Name: "1"},
   253  		{Name: "2"},
   254  	}
   255  	err := table.DeleteColumn(0)
   256  	assert.ItsNil(t, err)
   257  	assert.ItsEqual(t, "1", table.Columns[0].Name)
   258  	assert.ItsEqual(t, "2", table.Columns[1].Name)
   259  }
   260  
   261  func Test_Table_DeleteColumn_mid(t *testing.T) {
   262  	table := new(Table)
   263  	table.Columns = []TableColumn{
   264  		{Name: "0"},
   265  		{Name: "1"},
   266  		{Name: "2"},
   267  	}
   268  	err := table.DeleteColumn(1)
   269  	assert.ItsNil(t, err)
   270  	assert.ItsEqual(t, "0", table.Columns[0].Name)
   271  	assert.ItsEqual(t, "2", table.Columns[1].Name)
   272  }
   273  
   274  func Test_Table_DeleteColumn_end(t *testing.T) {
   275  	table := new(Table)
   276  	table.Columns = []TableColumn{
   277  		{Name: "0"},
   278  		{Name: "1"},
   279  		{Name: "2"},
   280  	}
   281  	err := table.DeleteColumn(2)
   282  	assert.ItsNil(t, err)
   283  	assert.ItsEqual(t, "0", table.Columns[0].Name)
   284  	assert.ItsEqual(t, "1", table.Columns[1].Name)
   285  }
   286  
   287  func Test_Table_ReorderRow(t *testing.T) {
   288  	table := new(Table)
   289  	table.Columns = []TableColumn{
   290  		{Name: "0", Values: []any{"0-0", "0-1", "0-2"}},
   291  		{Name: "1", Values: []any{"1-0", "1-1", "1-2", "1-3"}},
   292  		{Name: "2", Values: []any{"2-0", "2-1", "2-2", "2-3", "2-3"}},
   293  	}
   294  	err := table.ReorderRow(0, 1)
   295  	assert.ItsNil(t, err)
   296  	assert.ItsEqual(t, "0-1", table.Columns[0].Values[0])
   297  	assert.ItsEqual(t, "1-1", table.Columns[1].Values[0])
   298  	assert.ItsEqual(t, "2-1", table.Columns[2].Values[0])
   299  	assert.ItsEqual(t, "0-0", table.Columns[0].Values[1])
   300  	assert.ItsEqual(t, "1-0", table.Columns[1].Values[1])
   301  	assert.ItsEqual(t, "2-0", table.Columns[2].Values[1])
   302  }
   303  
   304  func Test_Table_InsertRow_zero(t *testing.T) {
   305  	table := new(Table)
   306  	table.Columns = []TableColumn{
   307  		{Name: "0", Values: []any{"0-0", "0-1", "0-2"}},
   308  		{Name: "1", Values: []any{"1-0", "1-1", "1-2", "1-3"}},
   309  		{Name: "2", Values: []any{"2-0", "2-1", "2-2", "2-3", "2-3"}},
   310  		{Name: "3", Values: []any{}},
   311  	}
   312  
   313  	err := table.InsertRow(0, []any{"a", "b", "c", "d"})
   314  	assert.ItsNil(t, err)
   315  	assert.ItsEqual(t, 4, len(table.Columns[0].Values))
   316  	assert.ItsEqual(t, "a", table.Columns[0].Values[0])
   317  	assert.ItsEqual(t, "0-0", table.Columns[0].Values[1])
   318  
   319  	assert.ItsEqual(t, 5, len(table.Columns[1].Values))
   320  	assert.ItsEqual(t, "b", table.Columns[1].Values[0])
   321  	assert.ItsEqual(t, "1-0", table.Columns[1].Values[1])
   322  
   323  	assert.ItsEqual(t, 6, len(table.Columns[2].Values))
   324  	assert.ItsEqual(t, "c", table.Columns[2].Values[0])
   325  	assert.ItsEqual(t, "2-0", table.Columns[2].Values[1])
   326  
   327  	assert.ItsEqual(t, 1, len(table.Columns[3].Values))
   328  	assert.ItsEqual(t, "d", table.Columns[3].Values[0])
   329  }
   330  
   331  func Test_Table_InsertRow_mid(t *testing.T) {
   332  	table := new(Table)
   333  	table.Columns = []TableColumn{
   334  		{Name: "0", Values: []any{"0-0", "0-1", "0-2"}},
   335  		{Name: "1", Values: []any{"1-0", "1-1", "1-2", "1-3"}},
   336  		{Name: "2", Values: []any{"2-0", "2-1", "2-2", "2-3", "2-3"}},
   337  		{Name: "3", Values: []any{}},
   338  	}
   339  
   340  	err := table.InsertRow(1, []any{"a", "b", "c", "d"})
   341  	assert.ItsNil(t, err)
   342  	assert.ItsEqual(t, 4, len(table.Columns[0].Values))
   343  	assert.ItsEqual(t, "a", table.Columns[0].Values[1])
   344  	assert.ItsEqual(t, "0-0", table.Columns[0].Values[0])
   345  
   346  	assert.ItsEqual(t, 5, len(table.Columns[1].Values))
   347  	assert.ItsEqual(t, "b", table.Columns[1].Values[1])
   348  	assert.ItsEqual(t, "1-0", table.Columns[1].Values[0])
   349  
   350  	assert.ItsEqual(t, 6, len(table.Columns[2].Values))
   351  	assert.ItsEqual(t, "c", table.Columns[2].Values[1])
   352  	assert.ItsEqual(t, "2-0", table.Columns[2].Values[0])
   353  
   354  	assert.ItsEqual(t, 2, len(table.Columns[3].Values))
   355  	assert.ItsNil(t, table.Columns[3].Values[0])
   356  	assert.ItsEqual(t, "d", table.Columns[3].Values[1])
   357  }
   358  
   359  func Test_Table_InsertRow_mid_short(t *testing.T) {
   360  	table := new(Table)
   361  	table.Columns = []TableColumn{
   362  		{Name: "0", Values: []any{"0-0", "0-1", "0-2"}},
   363  		{Name: "1", Values: []any{"1-0", "1-1", "1-2", "1-3"}},
   364  		{Name: "2", Values: []any{"2-0", "2-1", "2-2", "2-3", "2-3"}},
   365  		{Name: "3", Values: []any{}},
   366  	}
   367  
   368  	err := table.InsertRow(1, []any{"a", "b", "c"})
   369  	assert.ItsNil(t, err)
   370  	assert.ItsEqual(t, 4, len(table.Columns[0].Values))
   371  	assert.ItsEqual(t, "a", table.Columns[0].Values[1])
   372  	assert.ItsEqual(t, "0-0", table.Columns[0].Values[0])
   373  
   374  	assert.ItsEqual(t, 5, len(table.Columns[1].Values))
   375  	assert.ItsEqual(t, "b", table.Columns[1].Values[1])
   376  	assert.ItsEqual(t, "1-0", table.Columns[1].Values[0])
   377  
   378  	assert.ItsEqual(t, 6, len(table.Columns[2].Values))
   379  	assert.ItsEqual(t, "c", table.Columns[2].Values[1])
   380  	assert.ItsEqual(t, "2-0", table.Columns[2].Values[0])
   381  
   382  	assert.ItsEqual(t, 2, len(table.Columns[3].Values))
   383  	assert.ItsNil(t, table.Columns[3].Values[0])
   384  	assert.ItsNil(t, table.Columns[3].Values[1])
   385  }
   386  
   387  func Test_Table_InsertRow_mid_veryShort(t *testing.T) {
   388  	table := new(Table)
   389  	table.Columns = []TableColumn{
   390  		{Name: "0", Values: []any{"0-0", "0-1", "0-2"}},
   391  		{Name: "1", Values: []any{"1-0", "1-1", "1-2", "1-3"}},
   392  		{Name: "2", Values: []any{"2-0", "2-1", "2-2", "2-3", "2-3"}},
   393  		{Name: "3", Values: []any{}},
   394  	}
   395  
   396  	err := table.InsertRow(1, nil)
   397  	assert.ItsNil(t, err)
   398  	assert.ItsEqual(t, 4, len(table.Columns[0].Values))
   399  	assert.ItsNil(t, table.Columns[0].Values[1])
   400  	assert.ItsEqual(t, "0-0", table.Columns[0].Values[0])
   401  
   402  	assert.ItsEqual(t, 5, len(table.Columns[1].Values))
   403  	assert.ItsNil(t, table.Columns[1].Values[1])
   404  	assert.ItsEqual(t, "1-0", table.Columns[1].Values[0])
   405  
   406  	assert.ItsEqual(t, 6, len(table.Columns[2].Values))
   407  	assert.ItsNil(t, table.Columns[2].Values[1])
   408  	assert.ItsEqual(t, "2-0", table.Columns[2].Values[0])
   409  
   410  	assert.ItsEqual(t, 2, len(table.Columns[3].Values))
   411  	assert.ItsNil(t, table.Columns[3].Values[0])
   412  	assert.ItsNil(t, table.Columns[3].Values[1])
   413  }
   414  
   415  func Test_Table_InsertRow_mid2(t *testing.T) {
   416  	table := new(Table)
   417  	table.Columns = []TableColumn{
   418  		{Name: "0", Values: []any{"0-0", "0-1", "0-2"}},
   419  		{Name: "1", Values: []any{"1-0", "1-1", "1-2", "1-3"}},
   420  		{Name: "2", Values: []any{"2-0", "2-1", "2-2", "2-3", "2-3"}},
   421  		{Name: "3", Values: []any{}},
   422  	}
   423  
   424  	err := table.InsertRow(2, []any{"a", "b", "c", "d"})
   425  	assert.ItsNil(t, err)
   426  	assert.ItsEqual(t, 4, len(table.Columns[0].Values))
   427  	assert.ItsEqual(t, "0-0", table.Columns[0].Values[0])
   428  	assert.ItsEqual(t, "0-1", table.Columns[0].Values[1])
   429  	assert.ItsEqual(t, "a", table.Columns[0].Values[2])
   430  
   431  	assert.ItsEqual(t, 5, len(table.Columns[1].Values))
   432  	assert.ItsEqual(t, "1-0", table.Columns[1].Values[0])
   433  	assert.ItsEqual(t, "1-1", table.Columns[1].Values[1])
   434  	assert.ItsEqual(t, "b", table.Columns[1].Values[2])
   435  
   436  	assert.ItsEqual(t, 6, len(table.Columns[2].Values))
   437  	assert.ItsEqual(t, "2-0", table.Columns[2].Values[0])
   438  	assert.ItsEqual(t, "2-1", table.Columns[2].Values[1])
   439  	assert.ItsEqual(t, "c", table.Columns[2].Values[2])
   440  
   441  	assert.ItsEqual(t, 3, len(table.Columns[3].Values))
   442  	assert.ItsNil(t, table.Columns[3].Values[0])
   443  	assert.ItsNil(t, table.Columns[3].Values[1])
   444  	assert.ItsEqual(t, "d", table.Columns[3].Values[2])
   445  }
   446  
   447  func Test_Table_DeleteRow_zero(t *testing.T) {
   448  	table := new(Table)
   449  	table.Columns = []TableColumn{
   450  		{Name: "0", Values: []any{"0-0", "0-1", "0-2"}},
   451  		{Name: "1", Values: []any{"1-0", "1-1", "1-2", "1-3"}},
   452  		{Name: "2", Values: []any{"2-0", "2-1", "2-2", "2-3", "2-3"}},
   453  		{Name: "3", Values: []any{}},
   454  	}
   455  
   456  	err := table.DeleteRow(0)
   457  	assert.ItsNil(t, err)
   458  	assert.ItsEqual(t, 2, len(table.Columns[0].Values))
   459  	assert.ItsEqual(t, "0-1", table.Columns[0].Values[0])
   460  	assert.ItsEqual(t, "0-2", table.Columns[0].Values[1])
   461  
   462  	assert.ItsEqual(t, 3, len(table.Columns[1].Values))
   463  	assert.ItsEqual(t, "1-1", table.Columns[1].Values[0])
   464  	assert.ItsEqual(t, "1-2", table.Columns[1].Values[1])
   465  
   466  	assert.ItsEqual(t, 4, len(table.Columns[2].Values))
   467  	assert.ItsEqual(t, "2-1", table.Columns[2].Values[0])
   468  	assert.ItsEqual(t, "2-2", table.Columns[2].Values[1])
   469  
   470  	assert.ItsEqual(t, 0, len(table.Columns[3].Values))
   471  }
   472  
   473  func Test_Table_DeleteRow_mid(t *testing.T) {
   474  	table := new(Table)
   475  	table.Columns = []TableColumn{
   476  		{Name: "0", Values: []any{"0-0", "0-1", "0-2"}},
   477  		{Name: "1", Values: []any{"1-0", "1-1", "1-2", "1-3"}},
   478  		{Name: "2", Values: []any{"2-0", "2-1", "2-2", "2-3", "2-3"}},
   479  		{Name: "3", Values: []any{}},
   480  	}
   481  
   482  	err := table.DeleteRow(1)
   483  	assert.ItsNil(t, err)
   484  	assert.ItsEqual(t, 2, len(table.Columns[0].Values))
   485  	assert.ItsEqual(t, "0-0", table.Columns[0].Values[0])
   486  	assert.ItsEqual(t, "0-2", table.Columns[0].Values[1])
   487  
   488  	assert.ItsEqual(t, 3, len(table.Columns[1].Values))
   489  	assert.ItsEqual(t, "1-0", table.Columns[1].Values[0])
   490  	assert.ItsEqual(t, "1-2", table.Columns[1].Values[1])
   491  
   492  	assert.ItsEqual(t, 4, len(table.Columns[2].Values))
   493  	assert.ItsEqual(t, "2-0", table.Columns[2].Values[0])
   494  	assert.ItsEqual(t, "2-2", table.Columns[2].Values[1])
   495  
   496  	assert.ItsEqual(t, 0, len(table.Columns[3].Values))
   497  }
   498  
   499  func Test_Table_DeleteRow_end(t *testing.T) {
   500  	table := new(Table)
   501  	table.Columns = []TableColumn{
   502  		{Name: "0", Values: []any{"0-0", "0-1", "0-2"}},
   503  		{Name: "1", Values: []any{"1-0", "1-1", "1-2", "1-3"}},
   504  		{Name: "2", Values: []any{"2-0", "2-1", "2-2", "2-3", "2-3"}},
   505  		{Name: "3", Values: []any{}},
   506  	}
   507  
   508  	err := table.DeleteRow(2)
   509  	assert.ItsNil(t, err)
   510  	assert.ItsEqual(t, 2, len(table.Columns[0].Values))
   511  	assert.ItsEqual(t, "0-0", table.Columns[0].Values[0])
   512  	assert.ItsEqual(t, "0-1", table.Columns[0].Values[1])
   513  
   514  	assert.ItsEqual(t, 3, len(table.Columns[1].Values))
   515  	assert.ItsEqual(t, "1-0", table.Columns[1].Values[0])
   516  	assert.ItsEqual(t, "1-1", table.Columns[1].Values[1])
   517  
   518  	assert.ItsEqual(t, 4, len(table.Columns[2].Values))
   519  	assert.ItsEqual(t, "2-0", table.Columns[2].Values[0])
   520  	assert.ItsEqual(t, "2-1", table.Columns[2].Values[1])
   521  
   522  	assert.ItsEqual(t, 0, len(table.Columns[3].Values))
   523  }
   524  
   525  func Test_Table_ApplyOps(t *testing.T) {
   526  	table := new(Table)
   527  	table.Columns = []TableColumn{
   528  		{Name: "0", Values: []any{"0-0", "0-1", "0-2"}},
   529  		{Name: "1", Values: []any{"1-0", "1-1", "1-2", "1-3"}},
   530  		{Name: "2", Values: []any{"2-0", "2-1", "2-2", "2-3", "2-3"}},
   531  		{Name: "3", Values: []any{}},
   532  	}
   533  
   534  	ops := []TableOp{
   535  		{Type: TableOpTypeInsertColumn, Col: 4, Values: []any{"4-0", "4-1", "4-2", "4-3", "4-4"}},
   536  		{Type: TableOpTypeSet, Row: 0, Col: 4, Value: "4-0-a"},
   537  		{Type: TableOpTypeDeleteColumn, Col: 3},
   538  		{Type: TableOpTypeReorderColumn, Old: 0, New: 3},
   539  	}
   540  
   541  	err := table.ApplyOps(ops...)
   542  	assert.ItsNil(t, err)
   543  
   544  	assert.ItsEqual(t, "4-0-a", table.Columns[0].Values[0])
   545  }
   546  
   547  func Test_Table_Range(t *testing.T) {
   548  	table := new(Table)
   549  	table.Columns = []TableColumn{
   550  		{Name: "0", Values: []any{"0-0", "0-1"}},
   551  		{Name: "1", Values: []any{"1-0", "1-1", "1-2", "1-3"}},
   552  		{Name: "2", Values: []any{"2-0", "2-1", "2-2", "2-3", "2-3"}},
   553  		{Name: "3", Values: []any{"3-0", "3-1"}},
   554  		{Name: "4", Values: []any{"4-0", "4-1", "4-2", "4-3", "4-4", "4-5"}},
   555  	}
   556  
   557  	rangeValues := table.Range(TableRange{Top: 1, Left: 1, Bottom: 3, Right: 3})
   558  	assert.ItsLen(t, rangeValues, 3)
   559  
   560  	// NOTE(wc): ids are col-row!
   561  	assert.ItsLen(t, rangeValues[0], 3)
   562  	assert.ItsEqual(t, "1-1", rangeValues[0][0])
   563  	assert.ItsEqual(t, "2-1", rangeValues[0][1])
   564  	assert.ItsEqual(t, "3-1", rangeValues[0][2])
   565  
   566  	assert.ItsLen(t, rangeValues[1], 3)
   567  	assert.ItsEqual(t, "1-2", rangeValues[1][0])
   568  	assert.ItsEqual(t, "2-2", rangeValues[1][1])
   569  	assert.ItsEqual(t, nil, rangeValues[1][2])
   570  
   571  	assert.ItsLen(t, rangeValues[2], 3)
   572  	assert.ItsEqual(t, "1-2", rangeValues[1][0])
   573  	assert.ItsEqual(t, "2-2", rangeValues[1][1])
   574  	assert.ItsEqual(t, nil, rangeValues[1][2])
   575  }