public void FormatQuarterTest()
        {
            var quarter1  = CreateQuarter(ticker, period2021Q3, properties, descriptions);
            var quarter2  = CreateQuarter(ticker, period2021Q4, properties, descriptions);
            var csvOutput = TabularFormatter <Quarter> .Format(new List <Quarter> {
                quarter1, quarter2
            });

            var rows = csvOutput.ToRows().ToArray();

            Assert.AreEqual(2, rows.Length);

            var header       = rows[0];
            var firstDataRow = rows[1];

            // check header
            Assert.AreEqual("キー", header.Key);
            Assert.AreEqual("項目名", header.Name);
            Assert.AreEqual("単位", header.Unit);
            Assert.AreEqual(2, header.Values.Count);
            Assert.AreEqual(period2021Q3.ToString(), header.Values[0]);
            Assert.AreEqual(period2021Q4.ToString(), header.Values[1]);

            // check "key" row
            Assert.AreEqual(key, firstDataRow.Key);
            Assert.AreEqual(label, firstDataRow.Name);
            Assert.AreEqual(unit, firstDataRow.Unit);
            Assert.AreEqual(2, firstDataRow.Values.Count);
            Assert.AreEqual(value, firstDataRow.Values[0]);
            Assert.AreEqual(value, firstDataRow.Values[1]);
        }
        private void Execute()
        {
            if (!ValidateControls())
            {
                return;
            }
            try
            {
                var parameters = CreateParametersFromFormValues();
                var resources  = apiResourceGetter.GetQuarters(parameters);
                var quarters   = resources.ToList();
                if (quarters.Count == 0)
                {
                    MessageBox.Show("条件に当てはまる財務データがありませんでした。", "CSV出力", MessageBoxButtons.OK);
                }
                else
                {
                    var tabular = TabularFormatter <Quarter> .Format(quarters);

                    var writer = quarterTabularWriterBuilder.Set(parameters).Build();
                    writer.Write(tabular);
                    MessageBox.Show("財務データの取得が完了しました", "CSV出力", MessageBoxButtons.OK);
                }
                DialogResult = DialogResult.OK;
            }
            // user cancel
            catch (OperationCanceledException)
            {
                MessageBox.Show("CSV出力がキャンセルされました", "CSV出力", MessageBoxButtons.OK);
            }
            // known errors
            catch (BaseBuffettCodeException bce)
            {
                var message = CsvDownloadExceptionHandler.ToMessageBoxString(bce);
                MessageBox.Show(message, "CSV出力", MessageBoxButtons.OK);
            }
            // unknown errors
            catch (Exception e)
            {
                var bce = BuffettCodeExceptionFinder.Find(e);
                if (bce is null)
                {
                    MessageBox.Show($"予期せぬエラーが発生しました。\n{e}", "CSV出力", MessageBoxButtons.OK);
                }
                else
                {
                    var message = CsvDownloadExceptionHandler.ToMessageBoxString(bce);
                    MessageBox.Show(message, "CSV出力", MessageBoxButtons.OK);
                }
            }
            Close();
        }