summaryrefslogtreecommitdiff
path: root/sc/qa/unit/ucalc.cxx
diff options
context:
space:
mode:
Diffstat (limited to 'sc/qa/unit/ucalc.cxx')
-rw-r--r--sc/qa/unit/ucalc.cxx325
1 files changed, 0 insertions, 325 deletions
diff --git a/sc/qa/unit/ucalc.cxx b/sc/qa/unit/ucalc.cxx
index 228fafa23ef4..e92fd6f4345d 100644
--- a/sc/qa/unit/ucalc.cxx
+++ b/sc/qa/unit/ucalc.cxx
@@ -109,35 +109,6 @@ FormulaGrammarSwitch::~FormulaGrammarSwitch()
mpDoc->SetGrammar(meOldGrammar);
}
-class MeasureTimeSwitch
-{
- double& mrDiff;
- TimeValue maTimeBefore;
-public:
- explicit MeasureTimeSwitch(double& rDiff) : mrDiff(rDiff)
- {
- mrDiff = 9999.0;
- osl_getSystemTime(&maTimeBefore);
- }
-
- ~MeasureTimeSwitch()
- {
- TimeValue aTimeAfter;
- osl_getSystemTime(&aTimeAfter);
- mrDiff = getTimeDiff(aTimeAfter, maTimeBefore);
- }
-
- static double getTimeDiff(const TimeValue& t1, const TimeValue& t2)
- {
- double tv1 = t1.Seconds;
- double tv2 = t2.Seconds;
- tv1 += t1.Nanosec / 1000000000.0;
- tv2 += t2.Nanosec / 1000000000.0;
-
- return tv1 - tv2;
- }
-};
-
Test::Test() :
m_pImpl(new TestImpl),
m_pDoc(nullptr)
@@ -174,302 +145,6 @@ void Test::tearDown()
BootstrapFixture::tearDown();
}
-#define PERF_ASSERT(df,scale,time,message) \
- do { \
- double dfscaled = df / scale; \
- if ((dfscaled) >= (time)) \
- { \
- std::ostringstream os; \
- os << message " took " << dfscaled << " pseudo-cycles (" << df << " real-time seconds), expected: " << time << " pseudo-cycles."; \
- CPPUNIT_FAIL(os.str().c_str()); \
- } \
- } while (false)
-
-void Test::testPerf()
-{
- CPPUNIT_ASSERT_MESSAGE ("failed to insert sheet", m_pDoc->InsertTab (0, "foo"));
-
- // First do a set of simple operations to try to work out
- // how fast (or not) this particular machine is:
- double scale;
- {
- MeasureTimeSwitch aTime(scale);
- for (int i = 0; i < 10000000; ++i)
- {
- // Bang on the allocator
- volatile ScRange *pRange = new ScRange (ScAddress (0,0,0));
- // Calc does quite a bit of string conversion
- volatile double it = OUString::number ((double)i/253.0).toDouble();
- // Do we have floating point math ?
- volatile double another = rtl::math::sin (it);
- (void)another;
- delete pRange;
- }
- }
- printf("CPU scale factor %g\n", scale);
-
- // FIXME: we should check if this already took too long
- // and if so not run the perf. tests to have pity on some
- // slow ARM machines - I think.
-
- // to make the numbers more round and helpful,
- // but the calculation of scale reasonably precise.
- scale /= 100000.0;
-
- double diff;
-
- // Clearing an already empty sheet should finish in a fraction of a
- // second. Flag failure if it takes more than one second. Clearing 100
- // columns should be large enough to flag if something goes wrong.
- {
- MeasureTimeSwitch aTime(diff);
- clearRange(m_pDoc, ScRange(0,0,0,99,MAXROW,0));
- }
- PERF_ASSERT(diff, scale, 1.0, "Clearing an empty sheet");
-
- {
- // Switch to R1C1 to make it easier to input relative references in multiple cells.
- FormulaGrammarSwitch aFGSwitch(m_pDoc, formula::FormulaGrammar::GRAM_ENGLISH_XL_R1C1);
-
- // Insert formulas in B1:B100000. This shouldn't take long, but may take
- // close to a second on a slower machine. We don't measure this yet, for
- // now.
- for (SCROW i = 0; i < 100000; ++i)
- m_pDoc->SetString(ScAddress(1,i,0), "=RC[-1]");
-
- // Now, Delete B2:B100000. This should complete in a fraction of a second
- // (0.06 sec on my machine).
- {
- MeasureTimeSwitch aTime(diff);
- clearRange(m_pDoc, ScRange(1,1,0,1,99999,0));
- }
- PERF_ASSERT(diff, scale, 2000, "Removal of a large array of formula cells");
- }
-
- clearRange(m_pDoc, ScRange(0,0,0,1,MAXROW,0)); // Clear columns A:B.
- CPPUNIT_ASSERT_MESSAGE("Column A shouldn't have any broadcasters.", !m_pDoc->HasBroadcaster(0,0));
- CPPUNIT_ASSERT_MESSAGE("Column B shouldn't have any broadcasters.", !m_pDoc->HasBroadcaster(0,1));
-
- {
- // Measure the performance of repeat-pasting a single cell to a large
- // cell range, undoing it, and redoing it.
-
- ScAddress aPos(0,0,0);
- m_pDoc->SetString(aPos, "test");
- ScMarkData aMark;
- aMark.SelectOneTable(0);
-
- // Copy cell A1 to clipboard.
- ScDocument aClipDoc(SCDOCMODE_CLIP);
- ScClipParam aParam(aPos, false);
- m_pDoc->CopyToClip(aParam, &aClipDoc, &aMark, false, false);
- CPPUNIT_ASSERT_EQUAL(m_pDoc->GetString(aPos), aClipDoc.GetString(aPos));
-
- ScDocument* pUndoDoc = new ScDocument(SCDOCMODE_UNDO);
- pUndoDoc->InitUndo(m_pDoc, 0, 0);
- m_pDoc->CopyToDocument(ScRange(aPos), InsertDeleteFlags::CONTENTS, false, pUndoDoc, &aMark);
-
- // Paste it to A2:A100000, and measure its duration.
- ScRange aPasteRange(0,1,0,0,99999,0);
- aMark.SetMarkArea(aPasteRange);
-
- {
- MeasureTimeSwitch aTime(diff);
- m_pDoc->CopyFromClip(aPasteRange, aMark, InsertDeleteFlags::CONTENTS, pUndoDoc, &aClipDoc);
- }
- PERF_ASSERT(diff, scale, 1500.0, "Pasting a single cell to A2:A100000");
-
- ScDocument* pRedoDoc = new ScDocument(SCDOCMODE_UNDO);
- pRedoDoc->InitUndo(m_pDoc, 0, 0);
- m_pDoc->CopyToDocument(aPasteRange, InsertDeleteFlags::CONTENTS, false, pRedoDoc, &aMark);
-
- // Create an undo object for this.
- ScRefUndoData* pRefUndoData = new ScRefUndoData(m_pDoc);
- ScUndoPaste aUndo(&getDocShell(), aPasteRange, aMark, pUndoDoc, pRedoDoc, InsertDeleteFlags::CONTENTS, pRefUndoData);
-
- // Make sure it did what it's supposed to do.
- CPPUNIT_ASSERT_EQUAL(m_pDoc->GetString(aPos), m_pDoc->GetString(aPasteRange.aStart));
- CPPUNIT_ASSERT_EQUAL(m_pDoc->GetString(aPos), m_pDoc->GetString(aPasteRange.aEnd));
-
- {
- MeasureTimeSwitch aTime(diff);
- aUndo.Undo();
- }
- PERF_ASSERT(diff, scale, 500.0, "Undoing a pasting of a cell to A2:A100000");
-
- // Make sure it's really undone.
- CPPUNIT_ASSERT_EQUAL(CELLTYPE_STRING, m_pDoc->GetCellType(aPos));
- CPPUNIT_ASSERT_EQUAL(CELLTYPE_NONE, m_pDoc->GetCellType(aPasteRange.aStart));
- CPPUNIT_ASSERT_EQUAL(CELLTYPE_NONE, m_pDoc->GetCellType(aPasteRange.aEnd));
-
- // Now redo.
- {
- MeasureTimeSwitch aTime(diff);
- aUndo.Redo();
- }
- PERF_ASSERT(diff, scale, 1000.0, "Redoing a pasting of a cell to A2:A100000");
-
- // Make sure it's really redone.
- CPPUNIT_ASSERT_EQUAL(m_pDoc->GetString(aPos), m_pDoc->GetString(aPasteRange.aStart));
- CPPUNIT_ASSERT_EQUAL(m_pDoc->GetString(aPos), m_pDoc->GetString(aPasteRange.aEnd));
- }
-
- clearRange(m_pDoc, ScRange(0,0,0,1,MAXROW,0)); // Clear columns A:B.
- CPPUNIT_ASSERT_MESSAGE("Column A shouldn't have any broadcasters.", !m_pDoc->HasBroadcaster(0,0));
- CPPUNIT_ASSERT_MESSAGE("Column B shouldn't have any broadcasters.", !m_pDoc->HasBroadcaster(0,1));
-
- {
- // Measure the performance of repeat-pasting 2 adjacent cells to a
- // large cell range, undoing it, and redoing it. The bottom one of
- // the two source cells is empty.
-
- ScRange aSrcRange(0,0,0,0,1,0); // A1:A2
-
- ScAddress aPos(0,0,0);
- m_pDoc->SetValue(aPos, 12);
- ScMarkData aMark;
- aMark.SetMarkArea(aSrcRange);
-
- // Copy to clipboard.
- ScDocument aClipDoc(SCDOCMODE_CLIP);
- ScClipParam aParam(aSrcRange, false);
- m_pDoc->CopyToClip(aParam, &aClipDoc, &aMark, false, false);
- CPPUNIT_ASSERT_EQUAL(m_pDoc->GetString(aPos), aClipDoc.GetString(aPos));
-
- ScDocument* pUndoDoc = new ScDocument(SCDOCMODE_UNDO);
- pUndoDoc->InitUndo(m_pDoc, 0, 0);
- m_pDoc->CopyToDocument(aSrcRange, InsertDeleteFlags::CONTENTS, false, pUndoDoc, &aMark);
-
- // Paste it to A3:A100001, and measure its duration.
- ScRange aPasteRange(0,2,0,0,100000,0);
- aMark.SetMarkArea(aPasteRange);
-
- {
- MeasureTimeSwitch aTime(diff);
- m_pDoc->CopyFromClip(aPasteRange, aMark, InsertDeleteFlags::CONTENTS, pUndoDoc, &aClipDoc);
- }
- PERF_ASSERT(diff, scale, 1000.0, "Pasting A1:A2 to A3:A100001");
-
- ScDocument* pRedoDoc = new ScDocument(SCDOCMODE_UNDO);
- pRedoDoc->InitUndo(m_pDoc, 0, 0);
- m_pDoc->CopyToDocument(aPasteRange, InsertDeleteFlags::CONTENTS, false, pRedoDoc, &aMark);
-
- // Create an undo object for this.
- ScRefUndoData* pRefUndoData = new ScRefUndoData(m_pDoc);
- ScUndoPaste aUndo(&getDocShell(), aPasteRange, aMark, pUndoDoc, pRedoDoc, InsertDeleteFlags::CONTENTS, pRefUndoData);
-
- // Make sure it did what it's supposed to do.
- CPPUNIT_ASSERT_EQUAL(m_pDoc->GetString(aPos), m_pDoc->GetString(aPasteRange.aStart));
- CPPUNIT_ASSERT_EQUAL(m_pDoc->GetString(aPos), m_pDoc->GetString(aPasteRange.aEnd));
- ScAddress aTmp = aPasteRange.aStart;
- aTmp.IncRow();
- CPPUNIT_ASSERT_EQUAL(CELLTYPE_NONE, m_pDoc->GetCellType(aTmp));
-
- {
- MeasureTimeSwitch aTime(diff);
- aUndo.Undo();
- }
- PERF_ASSERT(diff, scale, 500.0, "Undoing");
-
- // Make sure it's really undone.
- CPPUNIT_ASSERT_EQUAL(CELLTYPE_VALUE, m_pDoc->GetCellType(aPos));
- CPPUNIT_ASSERT_EQUAL(CELLTYPE_NONE, m_pDoc->GetCellType(aPasteRange.aStart));
- CPPUNIT_ASSERT_EQUAL(CELLTYPE_NONE, m_pDoc->GetCellType(aPasteRange.aEnd));
-
- // Now redo.
- {
- MeasureTimeSwitch aTime(diff);
- aUndo.Redo();
- }
- PERF_ASSERT(diff, scale, 800.0, "Redoing");
-
- // Make sure it's really redone.
- CPPUNIT_ASSERT_EQUAL(m_pDoc->GetString(aPos), m_pDoc->GetString(aPasteRange.aStart));
- CPPUNIT_ASSERT_EQUAL(m_pDoc->GetString(aPos), m_pDoc->GetString(aPasteRange.aEnd));
- }
-
- clearRange(m_pDoc, ScRange(0,0,0,1,MAXROW,0)); // Clear columns A:B.
- CPPUNIT_ASSERT_MESSAGE("Column A shouldn't have any broadcasters.", !m_pDoc->HasBroadcaster(0,0));
- CPPUNIT_ASSERT_MESSAGE("Column B shouldn't have any broadcasters.", !m_pDoc->HasBroadcaster(0,1));
-
- {
- // Measure the performance of repeat-pasting 2 adjacent cells to a
- // large cell range, undoing it, and redoing it. The bottom one of
- // the two source cells is empty. In this scenario, the non-empty
- // cell is a formula cell referencing a cell to the right, which
- // inserts a broadcaster to cell it references. So it has a higher
- // overhead than the previous scenario.
-
- ScRange aSrcRange(0,0,0,0,1,0); // A1:A2
-
- ScAddress aPos(0,0,0);
- m_pDoc->SetString(aPos, "=B1");
- ScMarkData aMark;
- aMark.SetMarkArea(aSrcRange);
-
- // Copy to clipboard.
- ScDocument aClipDoc(SCDOCMODE_CLIP);
- ScClipParam aParam(aSrcRange, false);
- m_pDoc->CopyToClip(aParam, &aClipDoc, &aMark, false, false);
- CPPUNIT_ASSERT_EQUAL(m_pDoc->GetString(aPos), aClipDoc.GetString(aPos));
-
- ScDocument* pUndoDoc = new ScDocument(SCDOCMODE_UNDO);
- pUndoDoc->InitUndo(m_pDoc, 0, 0);
- m_pDoc->CopyToDocument(aSrcRange, InsertDeleteFlags::CONTENTS, false, pUndoDoc, &aMark);
-
- // Paste it to A3:A50001, and measure its duration.
- ScRange aPasteRange(0,2,0,0,50000,0);
- aMark.SetMarkArea(aPasteRange);
-
- {
- MeasureTimeSwitch aTime(diff);
- m_pDoc->CopyFromClip(aPasteRange, aMark, InsertDeleteFlags::CONTENTS, pUndoDoc, &aClipDoc);
- }
- PERF_ASSERT(diff, scale, 2000.0, "Pasting");
-
- ScDocument* pRedoDoc = new ScDocument(SCDOCMODE_UNDO);
- pRedoDoc->InitUndo(m_pDoc, 0, 0);
- m_pDoc->CopyToDocument(aPasteRange, InsertDeleteFlags::CONTENTS, false, pRedoDoc, &aMark);
-
- // Create an undo object for this.
- ScRefUndoData* pRefUndoData = new ScRefUndoData(m_pDoc);
- ScUndoPaste aUndo(&getDocShell(), aPasteRange, aMark, pUndoDoc, pRedoDoc, InsertDeleteFlags::CONTENTS, pRefUndoData);
-
- // Make sure it did what it's supposed to do.
- CPPUNIT_ASSERT_EQUAL(CELLTYPE_FORMULA, m_pDoc->GetCellType(aPasteRange.aStart));
- CPPUNIT_ASSERT_EQUAL(CELLTYPE_FORMULA, m_pDoc->GetCellType(aPasteRange.aEnd));
- ScAddress aTmp = aPasteRange.aStart;
- aTmp.IncRow();
- CPPUNIT_ASSERT_EQUAL(CELLTYPE_NONE, m_pDoc->GetCellType(aTmp));
-
-#if 0 // TODO: Undo and redo of this scenario is currently not fast enough to be tested reliably.
- {
- MeasureTimeSwitch aTime(diff);
- aUndo.Undo();
- }
- PERF_ASSERT(diff, scale, 1.0, "Undoing");
-
- // Make sure it's really undone.
- CPPUNIT_ASSERT_EQUAL(CELLTYPE_FORMULA, m_pDoc->GetCellType(aPos));
- CPPUNIT_ASSERT_EQUAL(CELLTYPE_NONE, m_pDoc->GetCellType(aPasteRange.aStart));
- CPPUNIT_ASSERT_EQUAL(CELLTYPE_NONE, m_pDoc->GetCellType(aPasteRange.aEnd));
-
- // Now redo.
- {
- MeasureTimeSwitch aTime(diff);
- aUndo.Redo();
- }
- PERF_ASSERT(diff, scale, 1.0, "Redoing");
-
- // Make sure it's really redone.
- CPPUNIT_ASSERT_EQUAL(CELLTYPE_FORMULA, m_pDoc->GetCellType(aPasteRange.aStart));
- CPPUNIT_ASSERT_EQUAL(CELLTYPE_FORMULA, m_pDoc->GetCellType(aPasteRange.aEnd));
-#endif
- }
-
- m_pDoc->DeleteTab(0);
-}
-
void Test::testCollator()
{
CollatorWrapper* p = ScGlobal::GetCollator();