From de07d2f1d4f73c75e0341e1f79c8ff1a740e494e Mon Sep 17 00:00:00 2001 From: Pawel Pasterz Date: Wed, 23 Jun 2021 20:30:04 +0200 Subject: [PATCH] Enhance table builder logic" --- .../ftl/environment/TestEnvironmentInfo.kt | 3 +- .../environment/android/ListAndroidDevices.kt | 16 ++++---- .../ftl/environment/ios/ListIOsDevices.kt | 12 +++--- .../environment/ios/ListIOsSofwareVersions.kt | 11 ++--- .../kotlin/ftl/json/SavedMatrixTableUtil.kt | 19 ++++++--- .../android/orientations/ListOrientations.kt | 7 ++-- .../versions/ListAndroidSofwareVersions.kt | 13 +++--- .../firebase/test/ipblocks/IpBlocksToTable.kt | 4 +- .../cli/firebase/test/locale/ListLocales.kt | 9 +++-- .../ListNetworkConfiguration.kt | 15 +++---- .../providedsoftware/ListProvidedSoftware.kt | 4 +- .../main/kotlin/ftl/util/LogTableBuilder.kt | 40 ++++++++++++++----- .../kotlin/ftl/util/LogTableBuilderTest.kt | 8 ++-- .../test/kotlin/ftl/util/TableColumnTest.kt | 4 +- 14 files changed, 103 insertions(+), 62 deletions(-) diff --git a/test_runner/src/main/kotlin/ftl/environment/TestEnvironmentInfo.kt b/test_runner/src/main/kotlin/ftl/environment/TestEnvironmentInfo.kt index 2d67e17d6c..3d7bfc288c 100644 --- a/test_runner/src/main/kotlin/ftl/environment/TestEnvironmentInfo.kt +++ b/test_runner/src/main/kotlin/ftl/environment/TestEnvironmentInfo.kt @@ -1,5 +1,6 @@ package ftl.environment +import ftl.util.Alignment import ftl.util.SystemOutColor import ftl.util.TableColumn @@ -7,7 +8,7 @@ typealias TestEnvironmentInfo = MutableMap> internal fun TestEnvironmentInfo.getOrCreateList(key: String) = getOrPut(key) { mutableListOf() } -internal fun TestEnvironmentInfo.createTableColumnFor(key: String) = TableColumn(key, getValue(key)) +internal fun TestEnvironmentInfo.createTableColumnFor(key: String, alignment: Alignment) = TableColumn(key, getValue(key), alignment = alignment) internal val tagToSystemOutColorMapper: (String) -> SystemOutColor = { when { diff --git a/test_runner/src/main/kotlin/ftl/environment/android/ListAndroidDevices.kt b/test_runner/src/main/kotlin/ftl/environment/android/ListAndroidDevices.kt index b0fbf63366..ed25f1dbc9 100644 --- a/test_runner/src/main/kotlin/ftl/environment/android/ListAndroidDevices.kt +++ b/test_runner/src/main/kotlin/ftl/environment/android/ListAndroidDevices.kt @@ -16,7 +16,9 @@ import ftl.environment.createTableColumnFor import ftl.environment.getOrCreateList import ftl.environment.isValid import ftl.environment.tagToSystemOutColorMapper +import ftl.util.Alignment import ftl.util.SystemOutColor +import ftl.util.alignToTheXMark import ftl.util.applyColorsUsing import ftl.util.buildTable @@ -38,13 +40,13 @@ private fun List.createTestEnvironmentInfo() = } private fun TestEnvironmentInfo.createAndroidDevicesTable() = buildTable( - createTableColumnFor(MODEL_ID), - createTableColumnFor(MAKE), - createTableColumnFor(MODEL_NAME), - createTableColumnFor(FORM).applyColorsUsing(formToSystemOutColorMapper), - createTableColumnFor(RESOLUTION), - createTableColumnFor(OS_VERSION_IDS), - createTableColumnFor(TAGS).applyColorsUsing(tagToSystemOutColorMapper) + createTableColumnFor(MODEL_ID, Alignment.LEFT), + createTableColumnFor(MAKE, Alignment.LEFT), + createTableColumnFor(MODEL_NAME, Alignment.LEFT), + createTableColumnFor(FORM, Alignment.LEFT).applyColorsUsing(formToSystemOutColorMapper), + createTableColumnFor(RESOLUTION, Alignment.CENTER).alignToTheXMark(), + createTableColumnFor(OS_VERSION_IDS, Alignment.LEFT), + createTableColumnFor(TAGS, Alignment.LEFT).applyColorsUsing(tagToSystemOutColorMapper) ) private val DeviceModel.Android.resolution diff --git a/test_runner/src/main/kotlin/ftl/environment/ios/ListIOsDevices.kt b/test_runner/src/main/kotlin/ftl/environment/ios/ListIOsDevices.kt index 67f8a30b0b..5c1f3fb276 100644 --- a/test_runner/src/main/kotlin/ftl/environment/ios/ListIOsDevices.kt +++ b/test_runner/src/main/kotlin/ftl/environment/ios/ListIOsDevices.kt @@ -11,6 +11,8 @@ import ftl.environment.createTableColumnFor import ftl.environment.getOrCreateList import ftl.environment.isValid import ftl.environment.tagToSystemOutColorMapper +import ftl.util.Alignment +import ftl.util.alignToTheXMark import ftl.util.applyColorsUsing import ftl.util.buildTable @@ -33,9 +35,9 @@ private val DeviceModel.Ios.resolution get() = if (screenX.isValid() && screenY.isValid()) "$screenY x $screenX" else "UNKNOWN" private fun TestEnvironmentInfo.createIoDevicesTable() = buildTable( - createTableColumnFor(MODEL_ID), - createTableColumnFor(MODEL_NAME), - createTableColumnFor(RESOLUTION), - createTableColumnFor(OS_VERSION_IDS), - createTableColumnFor(TAGS).applyColorsUsing(tagToSystemOutColorMapper) + createTableColumnFor(MODEL_ID, Alignment.LEFT), + createTableColumnFor(MODEL_NAME, Alignment.LEFT), + createTableColumnFor(RESOLUTION, Alignment.CENTER).alignToTheXMark(), + createTableColumnFor(OS_VERSION_IDS, Alignment.LEFT), + createTableColumnFor(TAGS, Alignment.LEFT).applyColorsUsing(tagToSystemOutColorMapper) ) diff --git a/test_runner/src/main/kotlin/ftl/environment/ios/ListIOsSofwareVersions.kt b/test_runner/src/main/kotlin/ftl/environment/ios/ListIOsSofwareVersions.kt index f115f7e969..3653de6eb0 100644 --- a/test_runner/src/main/kotlin/ftl/environment/ios/ListIOsSofwareVersions.kt +++ b/test_runner/src/main/kotlin/ftl/environment/ios/ListIOsSofwareVersions.kt @@ -9,6 +9,7 @@ import ftl.environment.createTableColumnFor import ftl.environment.getOrCreateList import ftl.environment.orUnknown import ftl.environment.tagToSystemOutColorMapper +import ftl.util.Alignment import ftl.util.applyColorsUsing import ftl.util.buildTable @@ -42,11 +43,11 @@ private fun List.createTestEnvironmentInfoFromIosVersions() = } private fun TestEnvironmentInfo.createIOsSoftwareVersionsTable() = buildTable( - createTableColumnFor(OS_VERSION_ID), - createTableColumnFor(MAJOR_VERSION), - createTableColumnFor(MINOR_VERSION), - createTableColumnFor(TAGS).applyColorsUsing(tagToSystemOutColorMapper), - createTableColumnFor(SUPPORTED_XCODE_VERSION_IDS) + createTableColumnFor(OS_VERSION_ID, Alignment.CENTER), + createTableColumnFor(MAJOR_VERSION, Alignment.CENTER), + createTableColumnFor(MINOR_VERSION, Alignment.CENTER), + createTableColumnFor(TAGS, Alignment.CENTER).applyColorsUsing(tagToSystemOutColorMapper), + createTableColumnFor(SUPPORTED_XCODE_VERSION_IDS, Alignment.LEFT) ) private const val MAJOR_VERSION = "MAJOR_VERSION" diff --git a/test_runner/src/main/kotlin/ftl/json/SavedMatrixTableUtil.kt b/test_runner/src/main/kotlin/ftl/json/SavedMatrixTableUtil.kt index 923e0f8648..ecda4eac10 100644 --- a/test_runner/src/main/kotlin/ftl/json/SavedMatrixTableUtil.kt +++ b/test_runner/src/main/kotlin/ftl/json/SavedMatrixTableUtil.kt @@ -1,6 +1,7 @@ package ftl.json import ftl.api.TestMatrix +import ftl.util.Alignment import ftl.util.StepOutcome.failure import ftl.util.StepOutcome.flaky import ftl.util.StepOutcome.success @@ -14,27 +15,33 @@ fun List.asPrintableTable(): String = buildTable( TableColumn( header = OUTCOME_COLUMN_HEADER, data = flatMapTestAxis { outcome }, - dataColor = flatMapTestAxis { outcomeColor } + dataColor = flatMapTestAxis { outcomeColor }, + alignment = Alignment.LEFT ), TableColumn( header = MATRIX_ID_COLUMN_HEADER, - data = flatMapTestAxis { matrix -> matrix.matrixId } + data = flatMapTestAxis { matrix -> matrix.matrixId }, + alignment = Alignment.LEFT ), TableColumn( header = APP_NAME_COLUMN_HEADER, - data = flatMapTestAxis { matrix -> matrix.appFileName } + data = flatMapTestAxis { matrix -> matrix.appFileName }, + alignment = Alignment.LEFT ), TableColumn( header = TEST_APP_NAME_COLUMN_HEADER, - data = flatMapTestAxis { matrix -> matrix.testFileName } + data = flatMapTestAxis { matrix -> matrix.testFileName }, + alignment = Alignment.LEFT ), TableColumn( header = TEST_AXIS_VALUE_HEADER, - data = flatMapTestAxis { device } + data = flatMapTestAxis { device }, + alignment = Alignment.LEFT ), TableColumn( header = OUTCOME_DETAILS_COLUMN_HEADER, - data = flatMapTestAxis { details } + data = flatMapTestAxis { details }, + alignment = Alignment.LEFT ) ) diff --git a/test_runner/src/main/kotlin/ftl/presentation/cli/firebase/test/android/orientations/ListOrientations.kt b/test_runner/src/main/kotlin/ftl/presentation/cli/firebase/test/android/orientations/ListOrientations.kt index 379e83d804..f11ee6b852 100644 --- a/test_runner/src/main/kotlin/ftl/presentation/cli/firebase/test/android/orientations/ListOrientations.kt +++ b/test_runner/src/main/kotlin/ftl/presentation/cli/firebase/test/android/orientations/ListOrientations.kt @@ -5,6 +5,7 @@ import ftl.environment.TestEnvironmentInfo import ftl.environment.createTableColumnFor import ftl.environment.getOrCreateList import ftl.environment.tagToSystemOutColorMapper +import ftl.util.Alignment import ftl.util.applyColorsUsing import ftl.util.buildTable @@ -19,9 +20,9 @@ private fun List.createOrientationsDetails() = fold(mutableMapOf>.collectDataPerColumn() = map { (header, data) -> TableColumn(header, data) } +private fun Map>.collectDataPerColumn() = + map { (header, data) -> TableColumn(header = header, data = data, alignment = Alignment.LEFT) } private fun List.buildTable() = if (isNotEmpty()) ftl.util.buildTable(*toTypedArray(), tableStyle = TableStyle.DEFAULT) diff --git a/test_runner/src/main/kotlin/ftl/presentation/cli/firebase/test/locale/ListLocales.kt b/test_runner/src/main/kotlin/ftl/presentation/cli/firebase/test/locale/ListLocales.kt index 964232a922..7e6af4f955 100644 --- a/test_runner/src/main/kotlin/ftl/presentation/cli/firebase/test/locale/ListLocales.kt +++ b/test_runner/src/main/kotlin/ftl/presentation/cli/firebase/test/locale/ListLocales.kt @@ -7,6 +7,7 @@ import ftl.environment.createTableColumnFor import ftl.environment.getOrCreateList import ftl.environment.tagToSystemOutColorMapper import ftl.run.exception.FlankGeneralError +import ftl.util.Alignment import ftl.util.applyColorsUsing import ftl.util.buildTable @@ -23,10 +24,10 @@ fun List.createTestEnvironment() = } fun TestEnvironmentInfo.createLocalesTable() = buildTable( - createTableColumnFor(LOCALE), - createTableColumnFor(NAME), - createTableColumnFor(REGION), - createTableColumnFor(TAGS).applyColorsUsing(tagToSystemOutColorMapper) + createTableColumnFor(LOCALE, Alignment.LEFT), + createTableColumnFor(NAME, Alignment.LEFT), + createTableColumnFor(REGION, Alignment.LEFT), + createTableColumnFor(TAGS, Alignment.CENTER).applyColorsUsing(tagToSystemOutColorMapper) ) private const val LOCALE = "LOCALE" diff --git a/test_runner/src/main/kotlin/ftl/presentation/cli/firebase/test/networkprofiles/ListNetworkConfiguration.kt b/test_runner/src/main/kotlin/ftl/presentation/cli/firebase/test/networkprofiles/ListNetworkConfiguration.kt index acb3b925e9..485aba12e0 100644 --- a/test_runner/src/main/kotlin/ftl/presentation/cli/firebase/test/networkprofiles/ListNetworkConfiguration.kt +++ b/test_runner/src/main/kotlin/ftl/presentation/cli/firebase/test/networkprofiles/ListNetworkConfiguration.kt @@ -4,6 +4,7 @@ import ftl.api.NetworkProfile import ftl.environment.TestEnvironmentInfo import ftl.environment.createTableColumnFor import ftl.environment.getOrCreateList +import ftl.util.Alignment import ftl.util.TableStyle import ftl.util.buildTable @@ -35,13 +36,13 @@ private fun List.createConfigurationDetails() = fold(mutableMapO } private fun TestEnvironmentInfo.createConfigurationsTable() = buildTable( - createTableColumnFor(PROFILE_ID), - createTableColumnFor(RULE), - createTableColumnFor(DELAY), - createTableColumnFor(LOSS_RATION), - createTableColumnFor(DUPLICATION_RATION), - createTableColumnFor(BANDWIDTH), - createTableColumnFor(BURST), + createTableColumnFor(PROFILE_ID, Alignment.LEFT), + createTableColumnFor(RULE, Alignment.LEFT), + createTableColumnFor(DELAY, Alignment.CENTER), + createTableColumnFor(LOSS_RATION, Alignment.CENTER), + createTableColumnFor(DUPLICATION_RATION, Alignment.CENTER), + createTableColumnFor(BANDWIDTH, Alignment.CENTER), + createTableColumnFor(BURST, Alignment.CENTER), tableStyle = TableStyle.ROW_SEPARATOR ) diff --git a/test_runner/src/main/kotlin/ftl/presentation/cli/firebase/test/providedsoftware/ListProvidedSoftware.kt b/test_runner/src/main/kotlin/ftl/presentation/cli/firebase/test/providedsoftware/ListProvidedSoftware.kt index 92e48c66e2..9cf384c65c 100644 --- a/test_runner/src/main/kotlin/ftl/presentation/cli/firebase/test/providedsoftware/ListProvidedSoftware.kt +++ b/test_runner/src/main/kotlin/ftl/presentation/cli/firebase/test/providedsoftware/ListProvidedSoftware.kt @@ -1,13 +1,15 @@ package ftl.presentation.cli.firebase.test.providedsoftware import com.google.testing.model.ProvidedSoftwareCatalog +import ftl.util.Alignment import ftl.util.TableColumn import ftl.util.buildTable fun ProvidedSoftwareCatalog.toCliTable() = buildTable( TableColumn( ORCHESTRATOR_VERSION, - listOf(orchestratorVersion) + listOf(orchestratorVersion), + alignment = Alignment.LEFT ) ) diff --git a/test_runner/src/main/kotlin/ftl/util/LogTableBuilder.kt b/test_runner/src/main/kotlin/ftl/util/LogTableBuilder.kt index 8b9b644609..e8edd3640a 100644 --- a/test_runner/src/main/kotlin/ftl/util/LogTableBuilder.kt +++ b/test_runner/src/main/kotlin/ftl/util/LogTableBuilder.kt @@ -12,16 +12,19 @@ data class TableColumn( val header: String, val data: List, val dataColor: List = listOf(), - val columnSize: Int = ((data + header).maxByOrNull { it.length }?.length ?: 0) + DEFAULT_COLUMN_PADDING + val columnSize: Int = ((data + header).maxByOrNull { it.length }?.length ?: 0) + DEFAULT_COLUMN_PADDING, + val alignment: Alignment ) +enum class Alignment { + LEFT, CENTER +} + private data class DataWithSize( val data: String, val columnSize: Int, - val centered: Boolean -) { - constructor(data: String, columnSize: Int) : this(data, columnSize, data.matches("-?\\d+(\\.\\d+)?".toRegex())) -} + val alignment: Alignment +) private const val DEFAULT_COLUMN_PADDING = 2 @@ -63,7 +66,7 @@ fun buildTable(vararg tableColumns: TableColumn, tableStyle: TableStyle = TableS val builder = StringBuilder().apply { startTable(rowSizes) tableColumns - .map { DataWithSize(data = it.header, columnSize = it.columnSize, centered = true) } + .map { DataWithSize(data = it.header, columnSize = it.columnSize, alignment = Alignment.CENTER) } .apply { appendDataRow(this) } rowSeparator(rowSizes) appendData(tableColumns, rowSizes, tableStyle) @@ -92,7 +95,11 @@ private fun StringBuilder.rowSeparator(rowSizes: List) { appendLine() } -private fun StringBuilder.appendData(tableColumns: Array, rowSizes: List, tableStyle: TableStyle) { +private fun StringBuilder.appendData( + tableColumns: Array, + rowSizes: List, + tableStyle: TableStyle +) { val rowCount = (tableColumns.maxByOrNull { it.data.size } ?: tableColumns.first()).data.size (0 until rowCount) .map { rowNumber -> @@ -100,8 +107,8 @@ private fun StringBuilder.appendData(tableColumns: Array, rowSi val color = it.dataColor.getOrNull(rowNumber) ?: SystemOutColor.DEFAULT val data = it.data.getOrNull(rowNumber).orEmpty() val columnSize = it.columnSize - if (color == SystemOutColor.DEFAULT) DataWithSize(data, columnSize) - else DataWithSize(color.applyTo(data), columnSize + color.additionalLengthWhenApplied) + if (color == SystemOutColor.DEFAULT) DataWithSize(data, columnSize, it.alignment) + else DataWithSize(color.applyTo(data), columnSize + color.additionalLengthWhenApplied, it.alignment) } } .forEachIndexed { index, list -> @@ -131,7 +138,12 @@ private fun StringBuilder.appendTableSeparator(startChar: Char, middleChar: Char private fun StringBuilder.appendDataRow(data: List) { append(TABLE_VERTICAL_LINE) data.forEach { - if (it.centered) append(it.center()) else append(it.leftAligned()) + append( + when (it.alignment) { + Alignment.LEFT -> it.leftAligned() + Alignment.CENTER -> it.center() + } + ) append(TABLE_VERTICAL_LINE) } appendLine() @@ -145,3 +157,11 @@ private fun DataWithSize.center() = String.format( ) inline fun TableColumn.applyColorsUsing(mapper: (String) -> SystemOutColor) = copy(dataColor = data.map(mapper)) + +// RESOLUTION column needs dedicated alignment logic and data pre-processing +fun TableColumn.alignToTheXMark() = copy( + data = data.map { + val dimensions = it.split("x") + if (dimensions[0].length + 1 == dimensions[1].length) " $it" else it + } +) diff --git a/test_runner/src/test/kotlin/ftl/util/LogTableBuilderTest.kt b/test_runner/src/test/kotlin/ftl/util/LogTableBuilderTest.kt index e57472be11..973bd6855c 100644 --- a/test_runner/src/test/kotlin/ftl/util/LogTableBuilderTest.kt +++ b/test_runner/src/test/kotlin/ftl/util/LogTableBuilderTest.kt @@ -6,10 +6,10 @@ import org.junit.Test internal class LogTableBuilderTest { private val sampleColumns = arrayOf( - TableColumn("header1", listOf("value1"), columnSize = 10), - TableColumn("header2", listOf("value2"), columnSize = 15), - TableColumn("header3", listOf("value3"), columnSize = 20), - TableColumn("header4", listOf("value4"), columnSize = 21) + TableColumn("header1", listOf("value1"), columnSize = 10, alignment = Alignment.LEFT), + TableColumn("header2", listOf("value2"), columnSize = 15, alignment = Alignment.LEFT), + TableColumn("header3", listOf("value3"), columnSize = 20, alignment = Alignment.LEFT), + TableColumn("header4", listOf("value4"), columnSize = 21, alignment = Alignment.LEFT) ) @Test diff --git a/test_runner/src/test/kotlin/ftl/util/TableColumnTest.kt b/test_runner/src/test/kotlin/ftl/util/TableColumnTest.kt index 68c1556bca..b56ed326c5 100644 --- a/test_runner/src/test/kotlin/ftl/util/TableColumnTest.kt +++ b/test_runner/src/test/kotlin/ftl/util/TableColumnTest.kt @@ -11,7 +11,7 @@ internal class TableColumnTest { val expectedColumnSize = 8 // when - val tableColumn = TableColumn("55555", listOf("1", "22", "333", "4444", "55555", "666666")) + val tableColumn = TableColumn("55555", listOf("1", "22", "333", "4444", "55555", "666666"), alignment = Alignment.LEFT) // then assertThat(tableColumn.columnSize).isEqualTo(expectedColumnSize) @@ -23,7 +23,7 @@ internal class TableColumnTest { val expectedColumnSize = 7 // when - val tableColumn = TableColumn("55555", listOf("1", "22", "333", "4444")) + val tableColumn = TableColumn("55555", listOf("1", "22", "333", "4444"), alignment = Alignment.LEFT) // then assertThat(tableColumn.columnSize).isEqualTo(expectedColumnSize)