[Libreoffice-commits] core.git: Branch 'feature/unitver' - 2 commits - sc/qa sc/source

Benjamin Ni benjaminniri at hotmail.com
Tue Jun 30 05:59:02 PDT 2015


 sc/qa/unit/units.cxx                         |  149 +++++++++++++++++++--------
 sc/source/ui/miscdlgs/unitsconversiondlg.cxx |    7 +
 2 files changed, 116 insertions(+), 40 deletions(-)

New commits:
commit b290ccb0b3979e7ad344709b4d1018fee071f52a
Author: Benjamin Ni <benjaminniri at hotmail.com>
Date:   Tue Jun 30 06:40:38 2015 +0100

    Added more range conversion tests
    
    Change-Id: If4898e6c70cb9731af35d51457de28410f808b96

diff --git a/sc/qa/unit/units.cxx b/sc/qa/unit/units.cxx
index ee6af8a..28cffa2 100644
--- a/sc/qa/unit/units.cxx
+++ b/sc/qa/unit/units.cxx
@@ -321,6 +321,13 @@ void UnitsTest::testUnitVerification() {
     pTokens = pCell->GetCode();
     CPPUNIT_ASSERT(mpUnitsImpl->verifyFormula(pTokens, address, mpDoc) == FormulaStatus::VALID);
 
+    // SUM("cm","m")
+    address.IncRow();
+    mpDoc->SetFormula(address, "=SUM(A1,E1)");
+    pCell = mpDoc->GetFormulaCell(address);
+    pTokens = pCell->GetCode();
+    CPPUNIT_ASSERT(mpUnitsImpl->verifyFormula(pTokens, address, mpDoc) == FormulaStatus::ERROR_INPUT_SCALING);
+
     // PRODUCT("cm/","s")+"cm"
     address.IncRow();
     mpDoc->SetFormula(address, "=PRODUCT(C1:D1)+A1");
@@ -803,82 +810,144 @@ void UnitsTest::testRangeConversion() {
     mpDoc->EnsureTable(nTab);
 
     // Column 1: convert [cm] to [cm].
-    ScAddress headerAddress(0, 0, nTab);
-    mpDoc->SetString(headerAddress, "length [cm]");
+    ScAddress headerAddressCol1(0, 0, nTab);
+    mpDoc->SetString(headerAddressCol1, "length [cm]");
 
-    ScAddress address(headerAddress);
+    ScAddress addressCol1(headerAddressCol1);
 
     vector<double> values({10, 20, 30, 40, 1, 0.5, 0.25});
-    address.IncRow();
-    mpDoc->SetValues(address, values);
+    addressCol1.IncRow();
+    mpDoc->SetValues(addressCol1, values);
 
     // Test conversion of range _not_ including header
-    ScAddress endAddress( address.Col(), address.Row() + values.size() - 1, nTab);
+    ScAddress endAddressCol1( addressCol1.Col(), addressCol1.Row() + values.size() - 1, nTab);
 
-    ScRange aRange(address, endAddress);
+    ScRange aRange(addressCol1, endAddressCol1);
     CPPUNIT_ASSERT(mpUnitsImpl->convertCellUnits(aRange, mpDoc, "cm"));
     CPPUNIT_ASSERT(!mpUnitsImpl->convertCellUnits(aRange, mpDoc, "kg"));
 
-    CPPUNIT_ASSERT(mpDoc->GetString(headerAddress) == "length [cm]");
+    CPPUNIT_ASSERT(mpDoc->GetString(headerAddressCol1) == "length [cm]");
 
-    for (double d: values) {
+    for (double d: values)
+    {
         // Test that the value is unchanged
-        CPPUNIT_ASSERT(mpDoc->GetValue(address) == d);
+        CPPUNIT_ASSERT(mpDoc->GetValue(addressCol1) == d);
         // And NO annotation has been added
-        CPPUNIT_ASSERT(mpDoc->GetString(address) == OUString::number(d));
-        address.IncRow();
+        CPPUNIT_ASSERT(mpDoc->GetString(addressCol1) == OUString::number(d));
+        addressCol1.IncRow();
     }
 
     // Test conversion of range including header (from cm to cm)
-    aRange = ScRange(headerAddress, endAddress);
+    aRange = ScRange(headerAddressCol1, endAddressCol1);
     CPPUNIT_ASSERT(mpUnitsImpl->convertCellUnits(aRange, mpDoc, "cm"));
     CPPUNIT_ASSERT(!mpUnitsImpl->convertCellUnits(aRange, mpDoc, "kg"));
 
-    CPPUNIT_ASSERT(mpDoc->GetString(headerAddress) == "length [cm]");
+    CPPUNIT_ASSERT(mpDoc->GetString(headerAddressCol1) == "length [cm]");
 
-    address = headerAddress;
-    address.IncRow();
-    for (double d: values) {
-        CPPUNIT_ASSERT_DOUBLES_EQUAL(mpDoc->GetValue(address), d, 1e-7);
+    addressCol1 = headerAddressCol1;
+    addressCol1.IncRow();
+    for (double d: values)
+    {
+        CPPUNIT_ASSERT_DOUBLES_EQUAL(mpDoc->GetValue(addressCol1), d, 1e-7);
         // And NO annotation has been added
-        CPPUNIT_ASSERT(mpDoc->GetString(address) == OUString::number(d));
-        address.IncRow();
+        CPPUNIT_ASSERT(mpDoc->GetString(addressCol1) == OUString::number(d));
+        addressCol1.IncRow();
     }
 
     // Convert just the values (but not header): [cm] to [m]
-    address.SetRow(1);
-    aRange = ScRange(address, endAddress);
+    addressCol1.SetRow(1);
+    aRange = ScRange(addressCol1, endAddressCol1);
     CPPUNIT_ASSERT(mpUnitsImpl->convertCellUnits(aRange, mpDoc, "m"));
 
-    CPPUNIT_ASSERT(mpDoc->GetString(headerAddress) == "length [cm]");
+    CPPUNIT_ASSERT(mpDoc->GetString(headerAddressCol1) == "length [cm]");
 
-    for (double d: values) {
-        CPPUNIT_ASSERT_DOUBLES_EQUAL(mpDoc->GetValue(address), d/100, 1e-7);
-        // AND test annotation
-        // Disabled for now until the precision problems are figured out
-        // CPPUNIT_ASSERT(mpDoc->GetString(address) == OUString::number(d/100) + "m");
-        address.IncRow();
+    for (double d: values)
+    {
+        OUString aResultStr = mpDoc->GetString(addressCol1);
+        OUString aValStr  = aResultStr.copy( 0, aResultStr.getLength() - 1 ); // value portion of result
+        OUString aUnitStr = aResultStr.copy( aResultStr.getLength() - 1, 1 ); // annotation portion of result
+        CPPUNIT_ASSERT_DOUBLES_EQUAL(aValStr.toDouble(), d/100, 1e-7);
+        CPPUNIT_ASSERT(aUnitStr == "m");
+        addressCol1.IncRow();
     }
 
     // Convert everything (including header) to mm: [m] to [mm]
-    aRange = ScRange(headerAddress, endAddress);
+    aRange = ScRange(headerAddressCol1, endAddressCol1);
     CPPUNIT_ASSERT(mpUnitsImpl->convertCellUnits(aRange, mpDoc, "mm"));
 
-    CPPUNIT_ASSERT(mpDoc->GetString(headerAddress) == "length [mm]");
+    CPPUNIT_ASSERT(mpDoc->GetString(headerAddressCol1) == "length [mm]");
 
-    address.SetRow(1);
+    addressCol1.SetRow(1);
 
-    for (double d: values) {
-        CPPUNIT_ASSERT_DOUBLES_EQUAL(mpDoc->GetValue(address), d*10, 1e-7);
+    for (double d: values)
+    {
+        CPPUNIT_ASSERT_DOUBLES_EQUAL(mpDoc->GetValue(addressCol1), d*10, 1e-7);
         // And the annotation has been REMOVED
-        CPPUNIT_ASSERT(mpDoc->GetString(address) == OUString::number(d*10));
-        address.IncRow();
+        CPPUNIT_ASSERT(mpDoc->GetString(addressCol1) == OUString::number(d*10));
+        addressCol1.IncRow();
     }
 
-    // TODO: we need to test:
-    // 1. mixture of units that can't be converted
-    // 2. mixtures of local and header annotations
-    // 3. actual sensible ranges
+    // Column 2: [kg]
+    ScAddress headerAddressCol2(1, 0, nTab);
+    mpDoc->SetString(headerAddressCol2, "weight [kg]");
+
+    ScAddress addressCol2(headerAddressCol2);
+    addressCol2.IncRow();
+    mpDoc->SetValues(addressCol2, values);
+
+    ScAddress endAddressCol2( addressCol2.Col(), addressCol2.Row() + values.size() - 1, nTab);
+
+    // Column 3: [kg] (replica of Col2, but offset downwards by 1 cell)
+    ScAddress headerAddressCol3(2, 1, nTab);
+    mpDoc->SetString(headerAddressCol3, "weight [kg]");
+
+    ScAddress addressCol3(headerAddressCol3);
+    addressCol3.IncRow();
+    mpDoc->SetValues(addressCol3, values);
+
+    ScAddress endAddressCol3( addressCol3.Col(), addressCol3.Row() + values.size() - 1, nTab);
+
+    // test mixture [mm, kg] convert to [m]
+    addressCol1.SetRow(1);
+    aRange = ScRange(addressCol1, endAddressCol2); // over range of cm and kg values
+
+    CPPUNIT_ASSERT(!mpUnitsImpl->convertCellUnits(aRange, mpDoc, "m"));
+    for (double d: values) // test that convertible units are still converted
+    {
+        OUString aResultStr = mpDoc->GetString(addressCol1);
+        OUString aValStr  = aResultStr.copy( 0, aResultStr.getLength() - 1 ); // value portion of result
+        OUString aUnitStr = aResultStr.copy( aResultStr.getLength() - 1, 1 ); // annotation portion of result
+        CPPUNIT_ASSERT_DOUBLES_EQUAL(aValStr.toDouble(), d/100, 1e-7);
+        CPPUNIT_ASSERT(aUnitStr == "m");
+        addressCol1.IncRow();
+    }
+
+    // test mixture of local (Col2) and header (Col3) annotations
+    addressCol2.SetRow(1);
+    addressCol3.SetRow(2);
+
+    aRange = ScRange(addressCol2, endAddressCol3); // Col2 local, Col3 header
+    CPPUNIT_ASSERT(mpUnitsImpl->convertCellUnits(aRange, mpDoc, "g"));
+    CPPUNIT_ASSERT(mpDoc->GetString(headerAddressCol2) == "weight [kg]");
+    CPPUNIT_ASSERT(mpDoc->GetString(headerAddressCol3) == "weight [g]" );
+    for (double d: values)
+    {
+        OUString aResultStr = mpDoc->GetString(addressCol2);
+        OUString aValStr  = aResultStr.copy( 0, aResultStr.getLength() - 1 ); // value portion of result
+        OUString aUnitStr = aResultStr.copy( aResultStr.getLength() - 1, 1 ); // annotation portion of result
+        CPPUNIT_ASSERT_DOUBLES_EQUAL(aValStr.toDouble(), d*1000, 1e-7);
+        CPPUNIT_ASSERT(aUnitStr == "g");
+        addressCol2.IncRow();
+
+        if (addressCol3 != endAddressCol3)
+        {
+            CPPUNIT_ASSERT_DOUBLES_EQUAL(mpDoc->GetString(addressCol3).toDouble(), d*1000, 1e-7);
+            addressCol3.IncRow();
+        }
+
+        // TODO: we need to test:
+        // 1. actual sensible ranges
+    }
 }
 
 void UnitsTest::testConvertCellUnits()
commit 5e2962a92244e6c815e96e60250a6e12b91d7fa2
Author: Markus Mohrhard <markus.mohrhard at googlemail.com>
Date:   Tue Jun 30 14:38:09 2015 +0200

    refresh cell rendering after changing unit
    
    Change-Id: I6f68c319df89906b29d1f8409f6170a0b68c8b87

diff --git a/sc/source/ui/miscdlgs/unitsconversiondlg.cxx b/sc/source/ui/miscdlgs/unitsconversiondlg.cxx
index edd611e..a3a6744 100644
--- a/sc/source/ui/miscdlgs/unitsconversiondlg.cxx
+++ b/sc/source/ui/miscdlgs/unitsconversiondlg.cxx
@@ -13,6 +13,7 @@
 #include "reffact.hxx"
 #include "units.hxx"
 #include "viewdata.hxx"
+#include "docsh.hxx"
 
 using namespace sc::units;
 
@@ -266,7 +267,13 @@ void ScUnitsConversionDialog::PerformConversion()
 {
     OUString sOutputUnit = mpOutputUnitsEdit->GetText();
 
+    ScDocShell* pDocShell = static_cast<ScDocShell*>(mpDoc->GetDocumentShell());
+    ScDocShellModificator aModificator(*pDocShell);
     mpUnits->convertCellUnits( *mInputRange, mpDoc, sOutputUnit );
+    pDocShell->PostPaint(*mInputRange, PAINT_GRID);
+
+    aModificator.SetDocumentModified();
+    SfxGetpApp()->Broadcast(SfxSimpleHint(SC_HINT_AREAS_CHANGED));
 }
 
 /* vim:set shiftwidth=4 softtabstop=4 expandtab: */


More information about the Libreoffice-commits mailing list