Skip to content

Commit 5623c06

Browse files
committed
Fix IndexOutofRange exception
1 parent 8881713 commit 5623c06

3 files changed

Lines changed: 27 additions & 6 deletions

File tree

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,19 @@
11
using Microsoft.VisualStudio.TestTools.UnitTesting;
2+
using System;
23

34
namespace TextTableBuilder.Tests;
45

56
[TestClass]
67
public class TableBuilderTests
78
{
8-
//TODO...
9+
[TestMethod]
10+
public void Foo()
11+
{
12+
var table = new Table()
13+
.AddColumns(new[] { "A", "B", "C" })
14+
.AddRow(1, Guid.NewGuid(), DateTime.Now);
15+
16+
var tb = new TableBuilder();
17+
var result = tb.Build(table);
18+
}
919
}

TextTableBuilder/TableBuilder.cs

Lines changed: 14 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -38,9 +38,17 @@ public string Build(Table table, ITableRenderer tableRenderer, IFormatProvider f
3838
throw new ArgumentNullException(nameof(formatProvider));
3939
}
4040

41-
// Iterate all rows, creating strings from all values and keep track of column widths
4241
var cols = table.Columns.ToArray();
42+
43+
if (cols.Length == 0)
44+
{
45+
throw new InvalidOperationException("At least one column must be specified");
46+
}
47+
48+
// Determine preliminary columnwidths
4349
var colwidths = cols.Select((c, i) => Math.Max(cols[i].MinWidth ?? 0, Math.Min(c.Width ?? int.MaxValue, c.Name.Length))).ToArray(); // Initialize column widths to header widths or minimum widths or fixed widths; whichever is larger
50+
51+
// Iterate all rows, creating strings from all values and keep track of column widths
4452
var rows = new List<string[]>(table.Rows.Count);
4553
foreach (var row in table.Rows)
4654
{
@@ -51,7 +59,9 @@ public string Build(Table table, ITableRenderer tableRenderer, IFormatProvider f
5159
ObjectRow or => (ObjectHandlers.GetHandler(or.Value.GetType()) ?? ObjectHandlers.GetHandler(typeof(object))).Handle(or.Value, cols.Length),
5260
_ => throw new InvalidOperationException("Unknown rowtype")
5361
}).Select(
54-
(v, i) => v is null
62+
(v, i) => i >= cols.Length
63+
? throw new InvalidOperationException($"Number of values must match columns (row index: {rows.Count})")
64+
: v is null
5565
// Handle the special null-case with our NullHandler (if any, empty string otherwise)
5666
? (TypeHandlers.NullValueHandler?.Handle(formatProvider) ?? string.Empty)
5767
// Use typehandler from colum when specified, else use typehandler from type from value
@@ -60,8 +70,9 @@ public string Build(Table table, ITableRenderer tableRenderer, IFormatProvider f
6070
// Make sure we have all cells
6171
if (rowvalues.Length != cols.Length)
6272
{
63-
throw new InvalidOperationException($"Number of values must match columns (row {rows.Count})");
73+
throw new InvalidOperationException($"Number of values must match columns (row index: {rows.Count})");
6474
}
75+
6576
// Add row to internal collection
6677
rows.Add(rowvalues);
6778
// Update column widths

TextTableBuilder/TextTableBuilder.csproj

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -17,8 +17,8 @@
1717
<PackageTags>text;table;simple</PackageTags>
1818
<PackageReadmeFile>README.md</PackageReadmeFile>
1919
<PackageLicenseExpression>MIT</PackageLicenseExpression>
20-
<Version>1.1.0</Version>
21-
<PackageReleaseNotes>Added table renderers</PackageReleaseNotes>
20+
<Version>1.1.1</Version>
21+
<PackageReleaseNotes>Fix IndexOutofRange exception</PackageReleaseNotes>
2222
</PropertyGroup>
2323

2424
<ItemGroup>

0 commit comments

Comments
 (0)