summaryrefslogtreecommitdiff
path: root/filter/qa/unit/textfilterdetect.cxx
blob: 4083610b07365ec013643c7b81e8cfbd92e70372 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
/*
 * This file is part of the LibreOffice project.
 *
 * This Source Code Form is subject to the terms of the Mozilla Public
 * License, v. 2.0. If a copy of the MPL was not distributed with this
 * file, You can obtain one at http://mozilla.org/MPL/2.0/.
 */

#include <test/bootstrapfixture.hxx>
#include <unotest/macros_test.hxx>

#include <com/sun/star/document/XExtendedFilterDetection.hpp>
#include <com/sun/star/frame/Desktop.hpp>
#include <com/sun/star/lang/XServiceInfo.hpp>

#include <comphelper/processfactory.hxx>
#include <comphelper/propertyvalue.hxx>
#include <unotools/mediadescriptor.hxx>
#include <unotools/streamwrap.hxx>
#include <tools/stream.hxx>

namespace com::sun::star::io
{
class XInputStream;
}

using namespace com::sun::star;

namespace
{
/// Test class for PlainTextFilterDetect.
class TextFilterDetectTest : public test::BootstrapFixture, public unotest::MacrosTest
{
    uno::Reference<uno::XComponentContext> mxComponentContext;
    uno::Reference<lang::XComponent> mxComponent;

public:
    void setUp() override;
    void tearDown() override;
    uno::Reference<lang::XComponent>& getComponent() { return mxComponent; }
};

void TextFilterDetectTest::setUp()
{
    test::BootstrapFixture::setUp();

    mxComponentContext.set(comphelper::getComponentContext(getMultiServiceFactory()));
    mxDesktop.set(frame::Desktop::create(mxComponentContext));
}

void TextFilterDetectTest::tearDown()
{
    if (mxComponent.is())
        mxComponent->dispose();

    test::BootstrapFixture::tearDown();
}

char const DATA_DIRECTORY[] = "/filter/qa/unit/data/";

CPPUNIT_TEST_FIXTURE(TextFilterDetectTest, testTdf114428)
{
    uno::Reference<uno::XComponentContext> xComponentContext
        = comphelper::getComponentContext(getMultiServiceFactory());
    uno::Reference<document::XExtendedFilterDetection> xDetect(
        getMultiServiceFactory()->createInstance("com.sun.star.comp.filters.PlainTextFilterDetect"),
        uno::UNO_QUERY);
    OUString aURL = m_directories.getURLFromSrc(DATA_DIRECTORY) + "tdf114428.xhtml";
    SvFileStream aStream(aURL, StreamMode::READ);
    uno::Reference<io::XInputStream> xStream(new utl::OStreamWrapper(aStream));
    uno::Sequence<beans::PropertyValue> aDescriptor
        = { comphelper::makePropertyValue("DocumentService",
                                          OUString("com.sun.star.text.TextDocument")),
            comphelper::makePropertyValue("InputStream", xStream),
            comphelper::makePropertyValue("TypeName", OUString("generic_HTML")) };
    xDetect->detect(aDescriptor);
    utl::MediaDescriptor aMediaDesc(aDescriptor);
    OUString aFilterName = aMediaDesc.getUnpackedValueOrDefault("FilterName", OUString());
    // This was empty, XML declaration caused HTML detect to not handle XHTML.
    CPPUNIT_ASSERT_EQUAL(OUString("HTML (StarWriter)"), aFilterName);
}

CPPUNIT_TEST_FIXTURE(TextFilterDetectTest, testEmptyFile)
{
    // Given an empty file, with a pptx extension
    OUString aURL = m_directories.getURLFromSrc(DATA_DIRECTORY) + "empty.pptx";

    // When loading the file
    getComponent() = loadFromDesktop(aURL);

    // Then make sure it is opened in Impress.
    uno::Reference<lang::XServiceInfo> xServiceInfo(getComponent(), uno::UNO_QUERY);
    CPPUNIT_ASSERT(xServiceInfo.is());

    // Without the accompanying fix in place, this test would have failed, as it was opened in
    // Writer instead.
    CPPUNIT_ASSERT(xServiceInfo->supportsService("com.sun.star.presentation.PresentationDocument"));

    getComponent()->dispose();

    // Now also test ODT
    aURL = m_directories.getURLFromSrc(DATA_DIRECTORY) + "empty.odt";
    getComponent() = loadFromDesktop(aURL);
    xServiceInfo.set(getComponent(), uno::UNO_QUERY);
    CPPUNIT_ASSERT(xServiceInfo.is());
    // Make sure it opens in Writer.
    CPPUNIT_ASSERT(xServiceInfo->supportsService("com.sun.star.text.TextDocument"));
    getComponent()->dispose();

    // ... and ODP
    aURL = m_directories.getURLFromSrc(DATA_DIRECTORY) + "empty.odp";
    getComponent() = loadFromDesktop(aURL);
    xServiceInfo.set(getComponent(), uno::UNO_QUERY);
    CPPUNIT_ASSERT(xServiceInfo.is());
    // Without the accompanying fix in place, this test would have failed, as it was opened in
    // Writer instead.
    CPPUNIT_ASSERT(xServiceInfo->supportsService("com.sun.star.presentation.PresentationDocument"));
    getComponent()->dispose();

    // ... and DOC
    aURL = m_directories.getURLFromSrc(DATA_DIRECTORY) + "empty.doc";
    // Without the accompanying fix in place, this test would have failed, the import filter aborted
    // loading.
    getComponent() = loadFromDesktop(aURL);
    xServiceInfo.set(getComponent(), uno::UNO_QUERY);
    CPPUNIT_ASSERT(xServiceInfo.is());
    CPPUNIT_ASSERT(xServiceInfo->supportsService("com.sun.star.text.TextDocument"));
    uno::Reference<frame::XModel> xModel(getComponent(), uno::UNO_QUERY);
    uno::Sequence<beans::PropertyValue> aArgs = xModel->getArgs();
    comphelper::SequenceAsHashMap aMap(aArgs);
    OUString aFilterName;
    aMap["FilterName"] >>= aFilterName;
    // Without the accompanying fix in place, this test would have failed with:
    // - Expected: MS Word 97
    // - Actual  : MS WinWord 6.0
    // i.e. opening worked, but saving back failed instead of producing a WW8 binary file.
    CPPUNIT_ASSERT_EQUAL(OUString("MS Word 97"), aFilterName);
}
}

CPPUNIT_PLUGIN_IMPLEMENT();

/* vim:set shiftwidth=4 softtabstop=4 expandtab: */