Establishes the foundational structure, core Excel functionality, and tooling. - Implements base components for cells, ranges, columns, and rows. - Integrates a custom calculation engine with a wide range of Excel functions. - Adds comprehensive support for styling, conditional formatting, data validation, comments, pictures, and charts. - Configures build setup, project metadata (NuGet), and developer guidelines. - Includes editor and Git attributes for consistent code style and line endings.
201 lines
7.8 KiB
C#
201 lines
7.8 KiB
C#
using ClosedXML.Excel;
|
|
using NUnit.Framework;
|
|
using System;
|
|
using System.Collections.Generic;
|
|
|
|
namespace ClosedXML_Tests.Excel
|
|
{
|
|
/// <summary>
|
|
/// Summary description for UnitTest1
|
|
/// </summary>
|
|
[TestFixture]
|
|
public class XlHelperTests
|
|
{
|
|
private static void CheckColumnNumber(int column)
|
|
{
|
|
Assert.AreEqual(column, XLHelper.GetColumnNumberFromLetter(XLHelper.GetColumnLetterFromNumber(column)));
|
|
}
|
|
|
|
[Test]
|
|
public void InvalidA1Addresses()
|
|
{
|
|
Assert.IsFalse(XLHelper.IsValidA1Address(""));
|
|
Assert.IsFalse(XLHelper.IsValidA1Address("A"));
|
|
Assert.IsFalse(XLHelper.IsValidA1Address("a"));
|
|
Assert.IsFalse(XLHelper.IsValidA1Address("1"));
|
|
Assert.IsFalse(XLHelper.IsValidA1Address("-1"));
|
|
Assert.IsFalse(XLHelper.IsValidA1Address("AAAA1"));
|
|
Assert.IsFalse(XLHelper.IsValidA1Address("XFG1"));
|
|
|
|
Assert.IsFalse(XLHelper.IsValidA1Address("@A1"));
|
|
Assert.IsFalse(XLHelper.IsValidA1Address("@AA1"));
|
|
Assert.IsFalse(XLHelper.IsValidA1Address("@AAA1"));
|
|
Assert.IsFalse(XLHelper.IsValidA1Address("[A1"));
|
|
Assert.IsFalse(XLHelper.IsValidA1Address("[AA1"));
|
|
Assert.IsFalse(XLHelper.IsValidA1Address("[AAA1"));
|
|
Assert.IsFalse(XLHelper.IsValidA1Address("{A1"));
|
|
Assert.IsFalse(XLHelper.IsValidA1Address("{AA1"));
|
|
Assert.IsFalse(XLHelper.IsValidA1Address("{AAA1"));
|
|
|
|
Assert.IsFalse(XLHelper.IsValidA1Address("A1@"));
|
|
Assert.IsFalse(XLHelper.IsValidA1Address("AA1@"));
|
|
Assert.IsFalse(XLHelper.IsValidA1Address("AAA1@"));
|
|
Assert.IsFalse(XLHelper.IsValidA1Address("A1["));
|
|
Assert.IsFalse(XLHelper.IsValidA1Address("AA1["));
|
|
Assert.IsFalse(XLHelper.IsValidA1Address("AAA1["));
|
|
Assert.IsFalse(XLHelper.IsValidA1Address("A1{"));
|
|
Assert.IsFalse(XLHelper.IsValidA1Address("AA1{"));
|
|
Assert.IsFalse(XLHelper.IsValidA1Address("AAA1{"));
|
|
|
|
Assert.IsFalse(XLHelper.IsValidA1Address("@A1@"));
|
|
Assert.IsFalse(XLHelper.IsValidA1Address("@AA1@"));
|
|
Assert.IsFalse(XLHelper.IsValidA1Address("@AAA1@"));
|
|
Assert.IsFalse(XLHelper.IsValidA1Address("[A1["));
|
|
Assert.IsFalse(XLHelper.IsValidA1Address("[AA1["));
|
|
Assert.IsFalse(XLHelper.IsValidA1Address("[AAA1["));
|
|
Assert.IsFalse(XLHelper.IsValidA1Address("{A1{"));
|
|
Assert.IsFalse(XLHelper.IsValidA1Address("{AA1{"));
|
|
Assert.IsFalse(XLHelper.IsValidA1Address("{AAA1{"));
|
|
}
|
|
|
|
[Test]
|
|
public void PlusAA1_Is_Not_an_address()
|
|
{
|
|
Assert.IsFalse(XLHelper.IsValidA1Address("+AA1"));
|
|
}
|
|
|
|
[Test]
|
|
public void TestConvertColumnLetterToNumberAnd()
|
|
{
|
|
CheckColumnNumber(1);
|
|
CheckColumnNumber(27);
|
|
CheckColumnNumber(28);
|
|
CheckColumnNumber(52);
|
|
CheckColumnNumber(53);
|
|
CheckColumnNumber(1000);
|
|
CheckColumnNumber(1353);
|
|
}
|
|
|
|
[Test]
|
|
public void ValidA1Addresses()
|
|
{
|
|
Assert.IsTrue(XLHelper.IsValidA1Address("A1"));
|
|
Assert.IsTrue(XLHelper.IsValidA1Address("A" + XLHelper.MaxRowNumber));
|
|
Assert.IsTrue(XLHelper.IsValidA1Address("Z1"));
|
|
Assert.IsTrue(XLHelper.IsValidA1Address("Z" + XLHelper.MaxRowNumber));
|
|
|
|
Assert.IsTrue(XLHelper.IsValidA1Address("AA1"));
|
|
Assert.IsTrue(XLHelper.IsValidA1Address("AA" + XLHelper.MaxRowNumber));
|
|
Assert.IsTrue(XLHelper.IsValidA1Address("ZZ1"));
|
|
Assert.IsTrue(XLHelper.IsValidA1Address("ZZ" + XLHelper.MaxRowNumber));
|
|
|
|
Assert.IsTrue(XLHelper.IsValidA1Address("AAA1"));
|
|
Assert.IsTrue(XLHelper.IsValidA1Address("AAA" + XLHelper.MaxRowNumber));
|
|
Assert.IsTrue(XLHelper.IsValidA1Address(XLHelper.MaxColumnLetter + "1"));
|
|
Assert.IsTrue(XLHelper.IsValidA1Address(XLHelper.MaxColumnLetter + XLHelper.MaxRowNumber));
|
|
}
|
|
|
|
[Test]
|
|
public void TestColumnLetterLookup()
|
|
{
|
|
var columnLetters = new List<String>();
|
|
for (int c = 1; c <= XLHelper.MaxColumnNumber; c++)
|
|
{
|
|
var columnLetter = NaiveGetColumnLetterFromNumber(c);
|
|
columnLetters.Add(columnLetter);
|
|
|
|
Assert.AreEqual(columnLetter, XLHelper.GetColumnLetterFromNumber(c));
|
|
}
|
|
|
|
foreach (var cl in columnLetters)
|
|
{
|
|
var columnNumber = NaiveGetColumnNumberFromLetter(cl);
|
|
Assert.AreEqual(columnNumber, XLHelper.GetColumnNumberFromLetter(cl));
|
|
}
|
|
}
|
|
|
|
[TestCase("R")]
|
|
[TestCase("C")]
|
|
[TestCase("RC")]
|
|
[TestCase("R111C222")]
|
|
[TestCase("R[]C")]
|
|
[TestCase("RC[]")]
|
|
[TestCase("R[]C[]")]
|
|
[TestCase("R[111]C222")]
|
|
[TestCase("R111C[222]")]
|
|
[TestCase("R[111]C[222]")]
|
|
[TestCase("R[-111]C[-222]")]
|
|
public void ValidRCAddresses(string address)
|
|
{
|
|
Assert.IsTrue(XLHelper.IsValidRCAddress(address));
|
|
}
|
|
|
|
[TestCase("RD")]
|
|
[TestCase("CC")]
|
|
[TestCase("R[-]C222")]
|
|
[TestCase("R[]C[-]")]
|
|
[TestCase("_R111C222")]
|
|
public void InvalidRCAddresses(string address)
|
|
{
|
|
Assert.IsFalse(XLHelper.IsValidRCAddress(address));
|
|
}
|
|
|
|
#region Old XLHelper methods
|
|
|
|
private static readonly string[] letters = new[] { "A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "M", "N", "O", "P", "Q", "R", "S", "T", "U", "V", "W", "X", "Y", "Z" };
|
|
|
|
/// <summary>
|
|
/// These used to be the methods in XLHelper, but were later changed
|
|
/// We now use them as a check against the new methods
|
|
/// Gets the column number of a given column letter.
|
|
/// </summary>
|
|
/// <param name="columnLetter"> The column letter to translate into a column number. </param>
|
|
private static int NaiveGetColumnNumberFromLetter(string columnLetter)
|
|
{
|
|
if (string.IsNullOrEmpty(columnLetter)) throw new ArgumentNullException("columnLetter");
|
|
|
|
int retVal;
|
|
columnLetter = columnLetter.ToUpper();
|
|
|
|
//Extra check because we allow users to pass row col positions in as strings
|
|
if (columnLetter[0] <= '9')
|
|
{
|
|
retVal = Int32.Parse(columnLetter, XLHelper.NumberStyle, XLHelper.ParseCulture);
|
|
return retVal;
|
|
}
|
|
|
|
int sum = 0;
|
|
|
|
for (int i = 0; i < columnLetter.Length; i++)
|
|
{
|
|
sum *= 26;
|
|
sum += (columnLetter[i] - 'A' + 1);
|
|
}
|
|
|
|
return sum;
|
|
}
|
|
|
|
/// <summary>
|
|
/// Gets the column letter of a given column number.
|
|
/// </summary>
|
|
/// <param name="columnNumber">The column number to translate into a column letter.</param>
|
|
/// <param name="trimToAllowed">if set to <c>true</c> the column letter will be restricted to the allowed range.</param>
|
|
/// <returns></returns>
|
|
private static string NaiveGetColumnLetterFromNumber(int columnNumber, bool trimToAllowed = false)
|
|
{
|
|
if (trimToAllowed) columnNumber = XLHelper.TrimColumnNumber(columnNumber);
|
|
|
|
columnNumber--; // Adjust for start on column 1
|
|
if (columnNumber <= 25)
|
|
{
|
|
return letters[columnNumber];
|
|
}
|
|
var firstPart = (columnNumber) / 26;
|
|
var remainder = ((columnNumber) % 26) + 1;
|
|
return NaiveGetColumnLetterFromNumber(firstPart) + NaiveGetColumnLetterFromNumber(remainder);
|
|
}
|
|
|
|
#endregion Old XLHelper methods
|
|
}
|
|
}
|