Coverage Report

Created: 2026-05-16 09:25

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
/src/libreoffice/sc/source/ui/StatisticsDialogs/TTestDialog.cxx
Line
Count
Source
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
11
#include <memory>
12
13
#include <vcl/weld/Dialog.hxx>
14
15
#include <reffact.hxx>
16
#include <TableFillingAndNavigationTools.hxx>
17
#include <TTestDialog.hxx>
18
#include <scresid.hxx>
19
#include <strings.hrc>
20
21
ScTTestDialog::ScTTestDialog(
22
                    SfxBindings* pSfxBindings, SfxChildWindow* pChildWindow,
23
                    weld::Window* pParent, ScViewData& rViewData ) :
24
0
    ScStatisticsTwoVariableDialog(
25
0
            pSfxBindings, pChildWindow, pParent, rViewData,
26
0
            u"modules/scalc/ui/ttestdialog.ui"_ustr, u"TTestDialog"_ustr)
27
0
{
28
0
    m_xDialog->set_title(ScResId(STR_TTEST));
29
0
}
30
31
ScTTestDialog::~ScTTestDialog()
32
0
{}
33
34
void ScTTestDialog::Close()
35
0
{
36
0
    DoClose( ScTTestDialogWrapper::GetChildWindowId() );
37
0
}
38
39
TranslateId ScTTestDialog::GetUndoNameId()
40
0
{
41
0
    return STR_TTEST_UNDO_NAME;
42
0
}
43
44
ScRange ScTTestDialog::ApplyOutput(ScDocShell* pDocShell)
45
0
{
46
0
    AddressWalkerWriter aOutput(mOutputAddress, pDocShell, mDocument,
47
0
            formula::FormulaGrammar::mergeToGrammar( formula::FormulaGrammar::GRAM_ENGLISH, mAddressDetails.eConv));
48
0
    FormulaTemplate aTemplate(&mDocument);
49
50
0
    std::unique_ptr<DataRangeIterator> pVariable1Iterator;
51
0
    if (mGroupedBy == GroupedBy::BY_COLUMN)
52
0
        pVariable1Iterator.reset(new DataRangeByColumnIterator(mVariable1Range));
53
0
    else
54
0
        pVariable1Iterator.reset(new DataRangeByRowIterator(mVariable1Range));
55
56
0
    std::unique_ptr<DataRangeIterator> pVariable2Iterator;
57
0
    if (mGroupedBy == GroupedBy::BY_COLUMN)
58
0
        pVariable2Iterator.reset(new DataRangeByColumnIterator(mVariable2Range));
59
0
    else
60
0
        pVariable2Iterator.reset(new DataRangeByRowIterator(mVariable2Range));
61
62
0
    aTemplate.autoReplaceRange(u"%VARIABLE1_RANGE%"_ustr, pVariable1Iterator->get());
63
0
    aTemplate.autoReplaceRange(u"%VARIABLE2_RANGE%"_ustr, pVariable2Iterator->get());
64
65
0
    aOutput.writeBoldString(ScResId(STR_TTEST_UNDO_NAME));
66
0
    aOutput.newLine();
67
68
    // Alpha
69
0
    aOutput.writeString(ScResId(STR_LABEL_ALPHA));
70
0
    aOutput.nextColumn();
71
0
    aOutput.writeValue(0.05);
72
0
    aTemplate.autoReplaceAddress(u"%ALPHA%"_ustr, aOutput.current());
73
0
    aOutput.newLine();
74
75
    // Hypothesized mean difference
76
0
    aOutput.writeString(ScResId(STR_HYPOTHESIZED_MEAN_DIFFERENCE_LABEL));
77
0
    aOutput.nextColumn();
78
0
    aOutput.writeValue(0);
79
0
    aTemplate.autoReplaceAddress(u"%HYPOTHESIZED_MEAN_DIFFERENCE%"_ustr, aOutput.current());
80
0
    aOutput.newLine();
81
82
0
    aOutput.nextColumn();
83
0
    aOutput.writeBoldString(ScResId(STR_VARIABLE_1_LABEL));
84
0
    aOutput.nextColumn();
85
0
    aOutput.writeBoldString(ScResId(STR_VARIABLE_2_LABEL));
86
0
    aOutput.newLine();
87
88
0
    aOutput.writeString(ScResId(STRID_CALC_MEAN));
89
0
    aOutput.nextColumn();
90
0
    aTemplate.setTemplate("=AVERAGE(%VARIABLE1_RANGE%)");
91
0
    aOutput.writeFormula(aTemplate.getTemplate());
92
0
    aOutput.nextColumn();
93
0
    aTemplate.setTemplate("=AVERAGE(%VARIABLE2_RANGE%)");
94
0
    aOutput.writeFormula(aTemplate.getTemplate());
95
0
    aOutput.newLine();
96
97
0
    aOutput.writeString(ScResId(STRID_CALC_VARIANCE));
98
0
    aOutput.nextColumn();
99
0
    aTemplate.setTemplate("=VAR(%VARIABLE1_RANGE%)");
100
0
    aOutput.writeFormula(aTemplate.getTemplate());
101
0
    aOutput.nextColumn();
102
0
    aTemplate.setTemplate("=VAR(%VARIABLE2_RANGE%)");
103
0
    aOutput.writeFormula(aTemplate.getTemplate());
104
0
    aOutput.newLine();
105
106
    // Observations
107
0
    aOutput.writeString(ScResId(STR_OBSERVATIONS_LABEL));
108
0
    aOutput.nextColumn();
109
0
    aTemplate.setTemplate("=COUNT(%VARIABLE1_RANGE%)");
110
0
    aOutput.writeFormula(aTemplate.getTemplate());
111
0
    aOutput.nextColumn();
112
0
    aTemplate.setTemplate("=COUNT(%VARIABLE2_RANGE%)");
113
0
    aOutput.writeFormula(aTemplate.getTemplate());
114
0
    aOutput.newLine();
115
116
    // Pearson Correlation
117
0
    aOutput.writeString(ScResId(STR_TTEST_PEARSON_CORRELATION));
118
0
    aOutput.nextColumn();
119
0
    aTemplate.setTemplate("=CORREL(%VARIABLE1_RANGE%;%VARIABLE2_RANGE%)");
120
0
    aOutput.writeFormula(aTemplate.getTemplate());
121
0
    aOutput.newLine();
122
123
    // Observed mean difference
124
0
    aOutput.writeString(ScResId(STR_OBSERVED_MEAN_DIFFERENCE_LABEL));
125
0
    aOutput.nextColumn();
126
0
    aTemplate.setTemplate("=AVERAGE(IF(ISODD(IF(ISNUMBER(%VARIABLE1_RANGE%); 1; 0) * IF(ISNUMBER(%VARIABLE2_RANGE%); 1; 0)); %VARIABLE1_RANGE% - %VARIABLE2_RANGE%; \"NA\"))");
127
0
    aOutput.writeMatrixFormula(aTemplate.getTemplate());
128
0
    aTemplate.autoReplaceAddress(u"%OBSERVED_MEAN_DIFFERENCE%"_ustr, aOutput.current());
129
0
    aOutput.newLine();
130
131
    // Variance of the Differences
132
0
    aOutput.writeString(ScResId(STR_TTEST_VARIANCE_OF_THE_DIFFERENCES));
133
0
    aOutput.nextColumn();
134
0
    aTemplate.setTemplate("=VAR(IF(ISODD(IF(ISNUMBER(%VARIABLE1_RANGE%); 1; 0) * IF(ISNUMBER(%VARIABLE2_RANGE%); 1; 0)); %VARIABLE1_RANGE% - %VARIABLE2_RANGE%; \"NA\"))");
135
0
    aOutput.writeMatrixFormula(aTemplate.getTemplate());
136
0
    aTemplate.autoReplaceAddress(u"%VARIANCE_OF_DIFFERENCES%"_ustr, aOutput.current());
137
0
    aOutput.newLine();
138
139
    // df
140
0
    aOutput.writeString(ScResId(STR_ANOVA_LABEL_DF));
141
0
    aOutput.nextColumn();
142
0
    aTemplate.setTemplate("=SUM(IF(ISNUMBER(%VARIABLE1_RANGE%); 1; 0) * IF(ISNUMBER(%VARIABLE2_RANGE%); 1; 0)) - 1");
143
0
    aOutput.writeMatrixFormula(aTemplate.getTemplate());
144
0
    aTemplate.autoReplaceAddress(u"%DEGREE_OF_FREEDOM%"_ustr, aOutput.current());
145
0
    aOutput.newLine();
146
147
    // t stat
148
0
    aOutput.writeString(ScResId(STR_TTEST_T_STAT));
149
0
    aOutput.nextColumn();
150
0
    aTemplate.setTemplate("=(%OBSERVED_MEAN_DIFFERENCE% - %HYPOTHESIZED_MEAN_DIFFERENCE%) / (%VARIANCE_OF_DIFFERENCES% / ( %DEGREE_OF_FREEDOM% + 1)) ^ 0.5");
151
0
    aOutput.writeFormula(aTemplate.getTemplate());
152
0
    aTemplate.autoReplaceAddress(u"%T_STAT%"_ustr, aOutput.current());
153
0
    aOutput.newLine();
154
155
    // P one-tail
156
0
    aOutput.writeString(ScResId(STR_TTEST_P_ONE_TAIL));
157
0
    aOutput.nextColumn();
158
0
    aTemplate.setTemplate("=TDIST(ABS(%T_STAT%); %DEGREE_OF_FREEDOM%; 1)");
159
0
    aOutput.writeFormula(aTemplate.getTemplate());
160
0
    aOutput.newLine();
161
162
    // T critical one-tail
163
0
    aOutput.writeString(ScResId(STR_TTEST_T_CRITICAL_ONE_TAIL));
164
0
    aOutput.nextColumn();
165
0
    aTemplate.setTemplate("=TINV(2*%ALPHA%; %DEGREE_OF_FREEDOM%)");
166
0
    aOutput.writeFormula(aTemplate.getTemplate());
167
0
    aOutput.newLine();
168
169
    // P two-tail
170
0
    aOutput.writeString(ScResId(STR_TTEST_P_TWO_TAIL));
171
0
    aOutput.nextColumn();
172
0
    aTemplate.setTemplate("=TDIST(ABS(%T_STAT%); %DEGREE_OF_FREEDOM%; 2)");
173
0
    aOutput.writeFormula(aTemplate.getTemplate());
174
0
    aOutput.newLine();
175
176
    // T critical two-tail
177
0
    aOutput.writeString(ScResId(STR_TTEST_T_CRITICAL_TWO_TAIL));
178
0
    aOutput.nextColumn();
179
0
    aTemplate.setTemplate("=TINV(%ALPHA%; %DEGREE_OF_FREEDOM%)");
180
0
    aOutput.writeFormula(aTemplate.getTemplate());
181
182
0
    return ScRange(aOutput.mMinimumAddress, aOutput.mMaximumAddress);
183
0
}
184
185
/* vim:set shiftwidth=4 softtabstop=4 expandtab: */