Line data Source code
1 : /* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
2 : /*
3 : * This file is part of the LibreOffice project.
4 : *
5 : * This Source Code Form is subject to the terms of the Mozilla Public
6 : * License, v. 2.0. If a copy of the MPL was not distributed with this
7 : * file, You can obtain one at http://mozilla.org/MPL/2.0/.
8 : */
9 :
10 : #include <iostream>
11 :
12 : #include "docsh.hxx"
13 : #include "postit.hxx"
14 : #include "patattr.hxx"
15 : #include "scitems.hxx"
16 : #include "document.hxx"
17 : #include "cellform.hxx"
18 : #include "cellvalue.hxx"
19 :
20 : #define DEBUG_CSV_HANDLER 0
21 :
22 : namespace {
23 :
24 1416 : OUString getConditionalFormatString(ScDocument* pDoc, SCCOL nCol, SCROW nRow, SCTAB nTab)
25 : {
26 1416 : OUString aString;
27 : Color* pColor;
28 2832 : ScRefCellValue aCell;
29 1416 : aCell.assign(*pDoc, ScAddress(nCol, nRow, nTab));
30 1416 : if (aCell.isEmpty())
31 704 : return aString;
32 :
33 712 : const SfxItemSet* pCondSet = pDoc->GetCondResult( nCol, nRow, nTab );
34 712 : const ScPatternAttr* pPattern = pDoc->GetPattern(nCol, nRow, nTab);
35 712 : SvNumberFormatter* pFormatter = pDoc->GetFormatTable();
36 712 : sal_uInt32 nFormat = pPattern->GetNumberFormat( pFormatter, pCondSet );
37 712 : aString = ScCellFormat::GetString(*pDoc, ScAddress(nCol, nRow, nTab), nFormat, &pColor, *pFormatter);
38 712 : return aString;
39 : }
40 :
41 2208 : OString createErrorMessage(SCCOL nCol, SCROW nRow, SCTAB nTab)
42 : {
43 2208 : OStringBuffer aString("Error in Table: ");
44 2208 : aString.append(static_cast<sal_Int32>(nTab));
45 2208 : aString.append(" Column: ");
46 2208 : aString.append(static_cast<sal_Int32>(nCol));
47 2208 : aString.append(" Row: ");
48 2208 : aString.append(nRow);
49 2208 : return aString.makeStringAndClear();
50 : }
51 :
52 1994 : OString createErrorMessage(SCCOL nCol, SCROW nRow, SCTAB nTab, const OUString& rExpectedString, const OUString& rString)
53 : {
54 1994 : OStringBuffer aString(createErrorMessage(nCol, nRow, nTab));
55 1994 : aString.append("; Expected: '");
56 1994 : aString.append(OUStringToOString(rExpectedString, RTL_TEXTENCODING_UTF8));
57 1994 : aString.append("' Found: '");
58 1994 : aString.append(OUStringToOString(rString, RTL_TEXTENCODING_UTF8));
59 1994 : aString.append("'");
60 1994 : return aString.makeStringAndClear();
61 : }
62 :
63 214 : OString createErrorMessage(SCCOL nCol, SCROW nRow, SCTAB nTab, double aExpected, double aValue)
64 : {
65 214 : OStringBuffer aString(createErrorMessage(nCol, nRow, nTab));
66 214 : aString.append("; Expected: '");
67 214 : aString.append(aExpected);
68 214 : aString.append("' Found: '");
69 214 : aString.append(aValue);
70 214 : aString.append("'");
71 214 : return aString.makeStringAndClear();
72 :
73 : }
74 :
75 : }
76 :
77 : enum StringType { PureString, FormulaValue, StringValue };
78 :
79 : class csv_handler
80 : {
81 : public:
82 28 : csv_handler(ScDocument* pDoc, SCTAB nTab, StringType eType = StringValue):
83 : mpDoc(pDoc),
84 : mnCol(0),
85 : mnRow(0),
86 : mnTab(nTab),
87 28 : meStringType(eType) {}
88 :
89 28 : void begin_parse() {}
90 :
91 28 : void end_parse() {}
92 :
93 273 : void begin_row() {}
94 :
95 273 : void end_row()
96 : {
97 273 : ++mnRow;
98 273 : mnCol = 0;
99 273 : }
100 :
101 3175 : void cell(const char* p, size_t n)
102 : {
103 : #if DEBUG_CSV_HANDLER
104 : std::cout << "Col: " << mnCol << " Row: " << mnRow << std::endl;
105 : #endif //DEBUG_CSV_HANDLER
106 3175 : if (n == 0)
107 : {
108 : // Empty cell.
109 2383 : if (!mpDoc->GetString(mnCol, mnRow, mnTab).isEmpty())
110 : {
111 : // cell in the document is not empty.
112 0 : CPPUNIT_ASSERT_MESSAGE(createErrorMessage(mnCol, mnRow, mnTab).getStr(), false);
113 : }
114 : }
115 792 : else if (meStringType == PureString)
116 : {
117 390 : OUString aCSVString(p, n, RTL_TEXTENCODING_UTF8);
118 780 : OUString aString = mpDoc->GetString(mnCol, mnRow, mnTab);
119 :
120 : #if DEBUG_CSV_HANDLER
121 : std::cout << "String: " << OUStringToOString(aString, RTL_TEXTENCODING_UTF8).getStr() << std::endl;
122 : std::cout << "CSVString: " << OUStringToOString(aCSVString, RTL_TEXTENCODING_UTF8).getStr() << std::endl;
123 : std::cout << "result: " << (int)(aCSVString == aString) << std::endl;
124 : #endif //DEBUG_CSV_HANDLER
125 :
126 780 : CPPUNIT_ASSERT_EQUAL_MESSAGE(createErrorMessage(mnCol, mnRow, mnTab, aCSVString, aString).getStr(), aCSVString, aString);
127 : }
128 : else
129 : {
130 402 : char* pRemainingChars = NULL;
131 402 : std::string aStr(p, n);
132 402 : double nValue = strtod(&aStr[0], &pRemainingChars);
133 402 : if (*pRemainingChars)
134 : {
135 188 : OUString aString;
136 188 : switch (meStringType)
137 : {
138 : case StringValue:
139 188 : aString = mpDoc->GetString(mnCol, mnRow, mnTab);
140 188 : break;
141 : case FormulaValue:
142 0 : mpDoc->GetFormula(mnCol, mnRow, mnTab, aString);
143 0 : break;
144 : default:
145 0 : break;
146 : }
147 188 : OUString aCSVString(p, n, RTL_TEXTENCODING_UTF8);
148 : #if DEBUG_CSV_HANDLER
149 : std::cout << "String: " << OUStringToOString(aString, RTL_TEXTENCODING_UTF8).getStr() << std::endl;
150 : std::cout << "CSVString: " << OUStringToOString(aCSVString, RTL_TEXTENCODING_UTF8).getStr() << std::endl;
151 : std::cout << "result: " << (int)(aCSVString == aString) << std::endl;
152 : #endif //DEBUG_CSV_HANDLER
153 :
154 188 : CPPUNIT_ASSERT_EQUAL_MESSAGE(createErrorMessage(mnCol, mnRow, mnTab, aCSVString, aString).getStr(), aCSVString, aString);
155 : }
156 : else
157 : {
158 : double aValue;
159 214 : mpDoc->GetValue(mnCol, mnRow, mnTab, aValue);
160 : #if DEBUG_CSV_HANDLER
161 : std::cout << "Value: " << aValue << std::endl;
162 : std::cout << "CSVValue: " << nValue << std::endl;
163 : std::cout << "result: " << (int)(aValue == nValue) << std::endl;
164 : #endif //DEBUG_CSV_HANDLER
165 214 : CPPUNIT_ASSERT_MESSAGE(createErrorMessage(mnCol, mnRow, mnTab, nValue, aValue).getStr(), aValue == nValue);
166 402 : }
167 : }
168 3175 : ++mnCol;
169 3175 : }
170 :
171 : private:
172 : ScDocument* mpDoc;
173 : SCCOL mnCol;
174 : SCROW mnRow;
175 : SCTAB mnTab;
176 : StringType meStringType;
177 : };
178 :
179 :
180 : class conditional_format_handler
181 : {
182 : public:
183 5 : conditional_format_handler(ScDocument* pDoc, SCTAB nTab):
184 : mpDoc(pDoc),
185 : mnCol(0),
186 : mnRow(0),
187 5 : mnTab(nTab) {}
188 :
189 5 : void begin_parse() {}
190 :
191 5 : void end_parse() {}
192 :
193 90 : void begin_row() {}
194 :
195 90 : void end_row()
196 : {
197 90 : ++mnRow;
198 90 : mnCol = 0;
199 90 : }
200 :
201 1416 : void cell(const char* p, size_t n)
202 : {
203 : #if DEBUG_CSV_HANDLER
204 : std::cout << "Col: " << mnCol << " Row: " << mnRow << std::endl;
205 : #endif //DEBUG_CSV_HANDLER
206 1416 : OUString aString = getConditionalFormatString(mpDoc, mnCol, mnRow, mnTab);
207 2832 : OUString aCSVString(p, n, RTL_TEXTENCODING_UTF8);
208 : #if DEBUG_CSV_HANDLER
209 : std::cout << "String: " << OUStringToOString(aString, RTL_TEXTENCODING_UTF8).getStr() << std::endl;
210 : std::cout << "CSVString: " << OUStringToOString(aCSVString, RTL_TEXTENCODING_UTF8).getStr() << std::endl;
211 : std::cout << "result: " << (int)(aCSVString == aString) << std::endl;
212 : #endif //DEBUG_CSV_HANDLER
213 1416 : CPPUNIT_ASSERT_MESSAGE(createErrorMessage(mnCol, mnRow, mnTab, aCSVString, aString).getStr(), aString == aCSVString );
214 2832 : ++mnCol;
215 1416 : }
216 :
217 : private:
218 : ScDocument* mpDoc;
219 : SCCOL mnCol;
220 : SCROW mnRow;
221 : SCTAB mnTab;
222 : };
223 :
224 : /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
|