public IMathSpreadsheet Read()
        {
            var spreadsheet = new MathSpreadsheet(new Parser(), new Tokenizer());

            System.Console.WriteLine("Please provide spreadsheet size.");

            System.Console.Write("Columns count: ");

            if (!int.TryParse(System.Console.ReadLine(), out var columnsCount))
            {
                throw new SpreadsheetFormatException("Invalid columns count.");
            }

            System.Console.Write("Rows count: ");
            if (!int.TryParse(System.Console.ReadLine(), out var rowsCount))
            {
                throw new SpreadsheetFormatException("Invalid rows count");
            }

            var showInteractiveInput = columnsCount <= ColumnsThreshold && rowsCount <= RowsThreshold;

            if (!showInteractiveInput)
            {
                System.Console.WriteLine($"Spreadsheet size exceed {ColumnsThreshold} x {RowsThreshold} interactive output will be hidden because spreadsheet will not feet in console.");
            }

            spreadsheet.SetSize(columnsCount, rowsCount);

            System.Console.WriteLine(string.Empty);

            var left = System.Console.CursorLeft;
            var top  = System.Console.CursorTop;

            for (var rowNumber = 1; rowNumber <= rowsCount; rowNumber++)
            {
                for (var columnNumber = 1; columnNumber <= columnsCount; columnNumber++)
                {
                    if (showInteractiveInput)
                    {
                        CleanConsole(left, top);

                        System.Console.WriteLine(Print.PrintSpreadsheet(spreadsheet, true));
                    }

                    System.Console.Write($"Please enter { CellPosition.CoordinatesToKey(columnNumber, rowNumber) }: ");
                    var cellValue = System.Console.ReadLine();

                    spreadsheet.SetValue(columnNumber, rowNumber, cellValue);
                }
            }

            if (showInteractiveInput)
            {
                CleanConsole(left, top);
                System.Console.WriteLine(Print.PrintSpreadsheet(spreadsheet, true));
            }

            return(spreadsheet);
        }
        public void CoordinatesToKey_ValidCoordinates_CellKey(int column, int row, string expectedKey)
        {
            var key = CellPosition.CoordinatesToKey(column, row);

            Assert.Equal(expectedKey, key);
        }