diff --git a/sqldev/pom.xml b/sqldev/pom.xml index ac802062..1f603664 100644 --- a/sqldev/pom.xml +++ b/sqldev/pom.xml @@ -11,7 +11,7 @@ UTF-8 1.8 1.8 - 2.15.0 + 2.18.0 /Applications/SQLDeveloper19.1.0.app/Contents/Resources/sqldeveloper utplsql_for_SQLDev_${project.version} @@ -170,17 +170,17 @@ org.springframework spring-jdbc - 5.1.0.RELEASE + 5.1.8.RELEASE org.springframework spring-web - 5.1.0.RELEASE + 5.1.8.RELEASE org.oddgen org.oddgen.sqldev - 0.3.0 + 0.3.1 provided @@ -264,7 +264,7 @@ org.apache.maven.plugins maven-surefire-plugin - 2.22.0 + 2.22.2 -noverify @@ -296,7 +296,7 @@ org.apache.maven.plugins maven-antrun-plugin - 1.8 + 1.8 prepare-package @@ -400,7 +400,7 @@ org.apache.felix maven-bundle-plugin - 4.0.0 + 4.2.0 true ${project.name} @@ -450,7 +450,7 @@ maven-assembly-plugin - 3.1.0 + 3.1.1 ${final.name} false diff --git a/sqldev/src/main/java/org/utplsql/sqldev/model/preference/PreferenceModel.xtend b/sqldev/src/main/java/org/utplsql/sqldev/model/preference/PreferenceModel.xtend index 524c8c4f..43b212d1 100644 --- a/sqldev/src/main/java/org/utplsql/sqldev/model/preference/PreferenceModel.xtend +++ b/sqldev/src/main/java/org/utplsql/sqldev/model/preference/PreferenceModel.xtend @@ -39,6 +39,7 @@ class PreferenceModel extends HashStructureAdapter { static final String KEY_CLEAR_SCREEN = "clearScreen" static final String KEY_AUTO_EXECUTE = "autoExecute" static final String KEY_CHECK_RUN_UTPLSQL_TEST = "checkRunUtplsqlTest" + static final String KEY_USE_SMART_TIMES = "useSmartTimes" static final String KEY_NUMBER_OF_RUNS_IN_HISTORY = "numberOfRunsInHistory" static final String KEY_SHOW_DISABLED_COUNTER = "showDisabledCounter" static final String KEY_SHOW_WARNINGS_COUNTER = "showWarningsCounter" @@ -110,6 +111,14 @@ class PreferenceModel extends HashStructureAdapter { getHashStructure.putBoolean(PreferenceModel.KEY_CHECK_RUN_UTPLSQL_TEST, checkRunUtplsqlTest) } + def isUseSmartTimes() { + return getHashStructure.getBoolean(PreferenceModel.KEY_USE_SMART_TIMES, false) + } + + def setUseSmartTimes(boolean useSmartTimes) { + getHashStructure.putBoolean(PreferenceModel.KEY_USE_SMART_TIMES, useSmartTimes) + } + def getNumberOfRunsInHistory() { return getHashStructure.getInt(PreferenceModel.KEY_NUMBER_OF_RUNS_IN_HISTORY, 10) } diff --git a/sqldev/src/main/java/org/utplsql/sqldev/runner/UtplsqlRunner.xtend b/sqldev/src/main/java/org/utplsql/sqldev/runner/UtplsqlRunner.xtend index 8e7bf49a..2500e178 100644 --- a/sqldev/src/main/java/org/utplsql/sqldev/runner/UtplsqlRunner.xtend +++ b/sqldev/src/main/java/org/utplsql/sqldev/runner/UtplsqlRunner.xtend @@ -255,7 +255,7 @@ class UtplsqlRunner implements RealtimeReporterEventConsumer { private def initGUI() { var RunnerView dockable = null - if (runningInSqlDeveloper && (dockable = RunnerFactory.dockable as RunnerView) === null) { + if (runningInSqlDeveloper && (dockable = RunnerFactory.dockable) === null) { logger.severe('''Error getting utPLSQL dockable. Cannot run utPLSQL test.''') return false } else { diff --git a/sqldev/src/main/java/org/utplsql/sqldev/ui/preference/PreferencePanel.xtend b/sqldev/src/main/java/org/utplsql/sqldev/ui/preference/PreferencePanel.xtend index 2f49a44e..56667ee4 100644 --- a/sqldev/src/main/java/org/utplsql/sqldev/ui/preference/PreferencePanel.xtend +++ b/sqldev/src/main/java/org/utplsql/sqldev/ui/preference/PreferencePanel.xtend @@ -22,10 +22,12 @@ import javax.swing.JButton import javax.swing.JCheckBox import javax.swing.JOptionPane import javax.swing.JPanel +import javax.swing.JSeparator import javax.swing.JSpinner import javax.swing.JTabbedPane import javax.swing.JTextField import javax.swing.SpinnerNumberModel +import javax.swing.SwingConstants import javax.swing.table.DefaultTableModel import oracle.dbtools.raptor.templates.CodeTemplateUtil import oracle.ide.panels.DefaultTraversablePanel @@ -45,6 +47,7 @@ class PreferencePanel extends DefaultTraversablePanel { val JCheckBox clearScreenCheckBox = new JCheckBox val JCheckBox autoExecuteCheckBox = new JCheckBox val JCheckBox checkRunUtplsqlTestCheckBox = new JCheckBox + val JCheckBox useSmartTimesCheckBox = new JCheckBox val JButton importSnippetsButton = new JButton(UtplsqlResources.getString("PREF_IMPORT_SNIPPETS_BUTTON_LABEL")) val JPanel realtimeReporterPanel = new JPanel val SpinnerNumberModel numberOfRunsInHistoryModel = new SpinnerNumberModel(1, 1, 100, 1); @@ -104,6 +107,10 @@ class PreferencePanel extends DefaultTraversablePanel { runTab.add( runTab.field.label.withText(UtplsqlResources.getString("PREF_CHECK_RUN_UTPLSQL_TEST_LABEL")).component( checkRunUtplsqlTestCheckBox)) + runTab.add( + runTab.field.label.withText(UtplsqlResources.getString("PREF_USE_SMART_TIMES_LABEL")).component( + useSmartTimesCheckBox)) + runTab.addRow(new JSeparator(SwingConstants.HORIZONTAL)) runTab.addRow(importSnippetsButton) runTab.addVerticalSpring @@ -336,6 +343,7 @@ class PreferencePanel extends DefaultTraversablePanel { clearScreenCheckBox.selected = info.clearScreen autoExecuteCheckBox.selected = info.autoExecute checkRunUtplsqlTestCheckBox.selected = info.checkRunUtplsqlTest + useSmartTimesCheckBox.selected = info.useSmartTimes numberOfRunsInHistorySpinner.value = info.numberOfRunsInHistory showDisabledCounterCheckBox.selected = info.showDisabledCounter showWarningsCounterCheckBox.selected = info.showWarningsCounter @@ -371,6 +379,7 @@ class PreferencePanel extends DefaultTraversablePanel { info.autoExecute = autoExecuteCheckBox.selected info.numberOfRunsInHistory = numberOfRunsInHistorySpinner.value as Integer info.checkRunUtplsqlTest = checkRunUtplsqlTestCheckBox.selected + info.useSmartTimes = useSmartTimesCheckBox.selected info.showDisabledCounter = showDisabledCounterCheckBox.selected info.showWarningsCounter = showWarningsCounterCheckBox.selected info.showInfoCounter = showInfoCounterCheckBox.selected diff --git a/sqldev/src/main/java/org/utplsql/sqldev/ui/runner/GradientToolbar.xtend b/sqldev/src/main/java/org/utplsql/sqldev/ui/runner/GradientToolbar.xtend index 1fb4adaf..8c04e7b5 100644 --- a/sqldev/src/main/java/org/utplsql/sqldev/ui/runner/GradientToolbar.xtend +++ b/sqldev/src/main/java/org/utplsql/sqldev/ui/runner/GradientToolbar.xtend @@ -58,7 +58,7 @@ class GradientToolbar extends JToolBar { val g2d = g as Graphics2D val w = width val h = height - 1 - val h2 = height / 2 as int + val int h2 = height / 2 val colorTop = new Color(237, 237, 237) val colorMiddle = new Color(244, 244, 244) val colorBottom = new Color(254, 254, 254) diff --git a/sqldev/src/main/java/org/utplsql/sqldev/ui/runner/RunnerPanel.xtend b/sqldev/src/main/java/org/utplsql/sqldev/ui/runner/RunnerPanel.xtend index 5eb4de0f..6fe5f80d 100644 --- a/sqldev/src/main/java/org/utplsql/sqldev/ui/runner/RunnerPanel.xtend +++ b/sqldev/src/main/java/org/utplsql/sqldev/ui/runner/RunnerPanel.xtend @@ -26,7 +26,6 @@ import java.awt.event.ActionEvent import java.awt.event.ActionListener import java.awt.event.MouseEvent import java.awt.event.MouseListener -import java.text.DecimalFormat import java.util.ArrayList import java.util.regex.Pattern import javax.swing.BorderFactory @@ -75,6 +74,7 @@ class RunnerPanel implements ActionListener, MouseListener, HyperlinkListener { static val INDICATOR_WIDTH = 20 static val OVERVIEW_TABLE_ROW_HEIGHT = 20 static val TEXTPANE_DIM = new Dimension(100, 100) + static var boolean useSmartTimes LimitedLinkedHashMap runs = new LimitedLinkedHashMap(10) Run currentRun JPanel basePanel @@ -338,6 +338,7 @@ class RunnerPanel implements ActionListener, MouseListener, HyperlinkListener { fixCheckBoxMenuItem(showInfoIndicatorCheckBoxMenuItem) syncDetailTabCheckBoxMenuItem.selected = preferences.syncDetailTab fixCheckBoxMenuItem(syncDetailTabCheckBoxMenuItem) + useSmartTimes = preferences.useSmartTimes } def setModel(Run run) { @@ -349,7 +350,13 @@ class RunnerPanel implements ActionListener, MouseListener, HyperlinkListener { private def setCurrentRun(Run run) { if (run !== currentRun) { currentRun = run - testOverviewTableModel.setModel(run.tests, showTestDescriptionCheckBoxMenuItem.selected) + testOverviewTableModel.setModel(run.tests, showTestDescriptionCheckBoxMenuItem.selected, useSmartTimes) + val header = testOverviewTableModel.timeColumnName + val timeColumn = testOverviewTable.columnModel.getColumn(4) + if (timeColumn.headerValue != header) { + timeColumn.headerValue = header + testOverviewTable.tableHeader.repaint + } resetDerived val item = new ComboBoxItem(currentRun.reporterId, currentRun.name) runComboBox.selectedItem = item @@ -640,12 +647,10 @@ class RunnerPanel implements ActionListener, MouseListener, HyperlinkListener { } static class TimeFormatRenderer extends DefaultTableCellRenderer { - static val DecimalFormat formatter = new DecimalFormat("#,##0.000") - override getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int col) { - val renderedValue = if (value === null) {null} else {formatter.format(value as Number)} - return super.getTableCellRendererComponent(table, renderedValue, isSelected, hasFocus, row, col) + val smartTime = new SmartTime(value as Double, useSmartTimes) + return super.getTableCellRendererComponent(table, smartTime.toString, isSelected, hasFocus, row, col) } } diff --git a/sqldev/src/main/java/org/utplsql/sqldev/ui/runner/SmartTime.xtend b/sqldev/src/main/java/org/utplsql/sqldev/ui/runner/SmartTime.xtend new file mode 100644 index 00000000..627b6369 --- /dev/null +++ b/sqldev/src/main/java/org/utplsql/sqldev/ui/runner/SmartTime.xtend @@ -0,0 +1,72 @@ +/* + * Copyright 2019 Philipp Salvisberg + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.utplsql.sqldev.ui.runner + +import java.text.DecimalFormat + +class SmartTime { + var Double seconds + var boolean smart = false + + new() { + super() + } + + new(Double seconds, boolean smart) { + super() + this.seconds = seconds + this.smart = smart + } + + def setMillis(Double seconds) { + this.seconds = seconds + } + + def setSmart(boolean smart) { + this.smart = smart + } + + def getSeconds() { + return seconds + } + + override toString() { + var String ret; + if (seconds === null) { + ret = null + } else if (smart) { + if (seconds >= 60*60) { + val DecimalFormat formatter = new DecimalFormat("#0.00") + ret = formatter.format(seconds / 60 / 60) + " h" + } else if (seconds >= 60) { + val DecimalFormat formatter = new DecimalFormat("#0.00") + ret = formatter.format(seconds / 60) + " min" + } else if (seconds >= 1) { + val DecimalFormat formatter = new DecimalFormat("#0.000") + ret = formatter.format(seconds) + " s" + } else { + val DecimalFormat formatter = new DecimalFormat("##0") + ret = formatter.format(seconds * 1000) + " ms" + } + + } else { + val DecimalFormat formatter = new DecimalFormat("##,##0.000") + ret = formatter.format(seconds) + } + return ret + } + +} \ No newline at end of file diff --git a/sqldev/src/main/java/org/utplsql/sqldev/ui/runner/TestOverviewTableModel.xtend b/sqldev/src/main/java/org/utplsql/sqldev/ui/runner/TestOverviewTableModel.xtend index 55c42d8a..c0f021c2 100644 --- a/sqldev/src/main/java/org/utplsql/sqldev/ui/runner/TestOverviewTableModel.xtend +++ b/sqldev/src/main/java/org/utplsql/sqldev/ui/runner/TestOverviewTableModel.xtend @@ -27,6 +27,7 @@ class TestOverviewTableModel extends DefaultTableModel { String commonPrefix boolean commonPrefixCalculated boolean showDescription + boolean useSmartTimes new() { super() @@ -40,10 +41,11 @@ class TestOverviewTableModel extends DefaultTableModel { } } - def setModel(LinkedHashMap tests, boolean showDescription) { + def setModel(LinkedHashMap tests, boolean showDescription, boolean useSmartTimes) { commonPrefixCalculated = false this.tests = tests this.showDescription = showDescription + this.useSmartTimes = useSmartTimes calcCommonPrefix fireTableDataChanged() } @@ -70,6 +72,11 @@ class TestOverviewTableModel extends DefaultTableModel { } } + def getTimeColumnName() { + val timeColumnName = '''«UtplsqlResources.getString("RUNNER_TEST_EXECUTION_TIME_COLUMN")»«IF !useSmartTimes» [s]«ENDIF»''' + return timeColumnName + } + def getTest(int row) { val entry = tests.entrySet.get(row) val test = tests.get(entry.key) @@ -120,7 +127,7 @@ class TestOverviewTableModel extends DefaultTableModel { override getColumnName(int col) { return #["", "", "", UtplsqlResources.getString(if (showDescription) {"RUNNER_DESCRIPTION_LABEL"} else {"RUNNER_TEST_ID_COLUMN"}), - UtplsqlResources.getString("RUNNER_TEST_EXECUTION_TIME_COLUMN")].get(col) + timeColumnName].get(col) } override isCellEditable(int row, int column) { diff --git a/sqldev/src/main/resources/org/utplsql/sqldev/resources/UtplsqlResources.properties b/sqldev/src/main/resources/org/utplsql/sqldev/resources/UtplsqlResources.properties index a74fe55e..630bc2b3 100644 --- a/sqldev/src/main/resources/org/utplsql/sqldev/resources/UtplsqlResources.properties +++ b/sqldev/src/main/resources/org/utplsql/sqldev/resources/UtplsqlResources.properties @@ -32,6 +32,7 @@ PREF_RESET_PACKAGE_LABEL=Reset package before running utPLSQL? PREF_CLEAR_SCREEN_LABEL=Clear script output panel before running utPLSQL? PREF_AUTO_EXECUTE_LABEL=Execute unit test automatically? PREF_CHECK_RUN_UTPLSQL_TEST_LABEL=Check availability of menu option? +PREF_USE_SMART_TIMES_LABEL=Use smart times? PREF_IMPORT_SNIPPETS_BUTTON_LABEL=Import Snippets MENU_REALTIME_REPORTER_LABEL=Realtime Reporter PREF_NUMBER_OF_RUNS_IN_HISTORY_LABEL=Number of runs in history @@ -89,7 +90,7 @@ RUNNER_NO_TESTS_FOUND_TEXT=No tests found. RUNNER_RUN_MENUITEM=Run test RUNNER_RUN_WORKSHEET_MENUITEM=Run test in new worksheet RUNNER_TEST_ID_COLUMN=Suitepath -RUNNER_TEST_EXECUTION_TIME_COLUMN=Time [s] +RUNNER_TEST_EXECUTION_TIME_COLUMN=Time RUNNER_OWNER_LABEL=Owner RUNNER_PACKAGE_LABEL=Package RUNNER_PROCEDURE_LABEL=Procedure diff --git a/sqldev/src/main/resources/org/utplsql/sqldev/resources/UtplsqlResources_de.properties b/sqldev/src/main/resources/org/utplsql/sqldev/resources/UtplsqlResources_de.properties index cd4e0c12..2a275906 100644 --- a/sqldev/src/main/resources/org/utplsql/sqldev/resources/UtplsqlResources_de.properties +++ b/sqldev/src/main/resources/org/utplsql/sqldev/resources/UtplsqlResources_de.properties @@ -9,6 +9,7 @@ PREF_RESET_PACKAGE_LABEL=Package vor der Ausf PREF_CLEAR_SCREEN_LABEL=Skriptausgabe-Fenster vor der Ausführung von utPLSQL leeren? PREF_AUTO_EXECUTE_LABEL=Unit Test automatisch ausführen? PREF_CHECK_RUN_UTPLSQL_TEST_LABEL=Verfügbarkeit der Menüoption prüfen? +PREF_USE_SMART_TIMES_LABEL=Smarte Zeitangaben verwenden? PREF_IMPORT_SNIPPETS_BUTTON_LABEL=Code-Schnipsel importieren MENU_REALTIME_REPORTER_LABEL=Realtime Reporter PREF_NUMBER_OF_RUNS_IN_HISTORY_LABEL=Anzahl Ausführungen in der Historie @@ -66,7 +67,7 @@ RUNNER_NO_TESTS_FOUND_TEXT=Keine Tests gefunden. RUNNER_RUN_MENUITEM=Run testTest ausführen RUNNER_RUN_WORKSHEET_MENUITEM=Test in neuem Arbeitsblatt ausführuen RUNNER_TEST_ID_COLUMN_NAME=Suitepath -RUNNER_TEST_EXECUTION_TIME_COLUMN_NAME=Zeit [s] +RUNNER_TEST_EXECUTION_TIME_COLUMN_NAME=Zeit RUNNER_OWNER_LABEL=Besitzer RUNNER_PACKAGE_LABEL=Paket RUNNER_PROCEDURE_LABEL=Prozedur diff --git a/sqldev/src/test/java/org/utplsql/sqldev/test/coverage/CodeCoverageReporterDialogTest.xtend b/sqldev/src/test/java/org/utplsql/sqldev/test/coverage/CodeCoverageReporterDialogTest.xtend index a11c6b20..ffd3e963 100644 --- a/sqldev/src/test/java/org/utplsql/sqldev/test/coverage/CodeCoverageReporterDialogTest.xtend +++ b/sqldev/src/test/java/org/utplsql/sqldev/test/coverage/CodeCoverageReporterDialogTest.xtend @@ -26,7 +26,7 @@ class CodeCoverageReporterDialogTest extends AbstractJdbcTest{ val reporter = new CodeCoverageReporter(#["SCOTT"], #['a', 'b', 'c'], dataSource.connection) reporter.showParameterWindow Thread.sleep(4 * 1000) - reporter.frame.exit + reporter.frame?.exit } } \ No newline at end of file diff --git a/sqldev/src/test/java/org/utplsql/sqldev/test/dal/RealtimeReporterFetchSizeTest.xtend b/sqldev/src/test/java/org/utplsql/sqldev/test/dal/RealtimeReporterFetchSizeTest.xtend index b713cbc2..0bf3f7d9 100644 --- a/sqldev/src/test/java/org/utplsql/sqldev/test/dal/RealtimeReporterFetchSizeTest.xtend +++ b/sqldev/src/test/java/org/utplsql/sqldev/test/dal/RealtimeReporterFetchSizeTest.xtend @@ -104,7 +104,7 @@ class RealtimeReporterFetchSizeTest extends AbstractJdbcTest { @Test def void delayFreeStreamingConsumtion() { - val long TOLERANCE_MS = 400 + val long TOLERANCE_MS = 600 var ds = new SingleConnectionDataSource() ds.driverClassName = "oracle.jdbc.OracleDriver" ds.url = dataSource.url diff --git a/sqldev/src/test/java/org/utplsql/sqldev/test/preference/PreferenceModelTest.xtend b/sqldev/src/test/java/org/utplsql/sqldev/test/preference/PreferenceModelTest.xtend index 4b575fca..32e9c1f7 100644 --- a/sqldev/src/test/java/org/utplsql/sqldev/test/preference/PreferenceModelTest.xtend +++ b/sqldev/src/test/java/org/utplsql/sqldev/test/preference/PreferenceModelTest.xtend @@ -30,6 +30,7 @@ class PreferenceModelTest { Assert.assertFalse(model.clearScreen) Assert.assertTrue(model.autoExecute) Assert.assertFalse(model.checkRunUtplsqlTest) + Assert.assertFalse(model.useSmartTimes) Assert.assertEquals(model.numberOfRunsInHistory, 10) Assert.assertFalse(model.showDisabledCounter) Assert.assertFalse(model.showWarningsCounter) diff --git a/sqldev/src/test/java/org/utplsql/sqldev/test/runner/ExpectationTest.xtend b/sqldev/src/test/java/org/utplsql/sqldev/test/runner/ExpectationTest.xtend index 7aca6152..7c4cff39 100644 --- a/sqldev/src/test/java/org/utplsql/sqldev/test/runner/ExpectationTest.xtend +++ b/sqldev/src/test/java/org/utplsql/sqldev/test/runner/ExpectationTest.xtend @@ -1,3 +1,18 @@ +/* + * Copyright 2019 Philipp Salvisberg + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ package org.utplsql.sqldev.test.runner import org.junit.Assert diff --git a/sqldev/src/test/java/org/utplsql/sqldev/test/runner/SmartTimeTest.xtend b/sqldev/src/test/java/org/utplsql/sqldev/test/runner/SmartTimeTest.xtend new file mode 100644 index 00000000..8b104e27 --- /dev/null +++ b/sqldev/src/test/java/org/utplsql/sqldev/test/runner/SmartTimeTest.xtend @@ -0,0 +1,147 @@ +/* + * Copyright 2019 Philipp Salvisberg + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.utplsql.sqldev.test.runner + +import org.junit.Assert +import org.junit.Test +import org.utplsql.sqldev.ui.runner.SmartTime + +class SmartTimeTest { + + @Test + def null_default() { + val effective = (new SmartTime(null, false)).toString + Assert.assertEquals(null, effective); + } + + @Test + def null_smart() { + val effective = (new SmartTime(null, true)).toString + Assert.assertEquals(null, effective); + } + + @Test + def ms_0_default() { + val effective = (new SmartTime(0.0, false)).toString + Assert.assertEquals("0.000", effective); + } + + @Test + def ms_0_smart() { + val effective = (new SmartTime(0.0, true)).toString + Assert.assertEquals("0 ms", effective); + } + + @Test + def ms_999_default() { + val effective = (new SmartTime(0.999, false)).toString + Assert.assertEquals("0.999", effective); + } + + @Test + def ms_999_smart() { + val effective = (new SmartTime(0.999, true)).toString + Assert.assertEquals("999 ms", effective); + } + + @Test + def s_1_default() { + val effective = (new SmartTime(1.0, false)).toString + Assert.assertEquals("1.000", effective); + } + + @Test + def s_1_smart() { + val effective = (new SmartTime(1.0, true)).toString + Assert.assertEquals("1.000 s", effective); + } + + @Test + def s_59_default() { + val effective = (new SmartTime(59.999, false)).toString + Assert.assertEquals("59.999", effective); + } + + @Test + def s_59_smart() { + val effective = (new SmartTime(59.999, true)).toString + Assert.assertEquals("59.999 s", effective); + } + + @Test + def min_1_default() { + val effective = (new SmartTime(60.0, false)).toString + Assert.assertEquals("60.000", effective); + } + + @Test + def min_1_smart() { + val effective = (new SmartTime(60.0, true)).toString + Assert.assertEquals("1.00 min", effective); + } + + @Test + def min_59_default() { + val effective = (new SmartTime(3599.999, false)).toString + Assert.assertEquals("3,599.999", effective); + } + + @Test + def min_59_smart_and_rounded() { + val effective = (new SmartTime(3599.999, true)).toString + Assert.assertEquals("60.00 min", effective); + } + + @Test + def h_1_default() { + val effective = (new SmartTime(3600.0, false)).toString + Assert.assertEquals("3,600.000", effective); + } + + @Test + def h_1_smart() { + val effective = (new SmartTime(3600.0, true)).toString + Assert.assertEquals("1.00 h", effective); + } + + @Test + def h_max_default() { + val effective = (new SmartTime(99999.999, false)).toString + Assert.assertEquals("99,999.999", effective); + } + + @Test + def h_max_smart() { + val effective = (new SmartTime(99999.999, true)).toString + Assert.assertEquals("27.78 h", effective); + } + + @Test + def h_higher_than_max_default() { + // larger than format mask + // grouping separator applied, even if not specified in format mask + val effective = (new SmartTime(100000000.0, false)).toString + Assert.assertEquals("100,000,000.000", effective); + } + + @Test + def h_higher_than_max_smart() { + // larger than format mask + // no grouping separator applied (that's ok) + val effective = (new SmartTime(100000000.0, true)).toString + Assert.assertEquals("27777.78 h", effective); + } +} \ No newline at end of file