11be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania// Copyright 2006, Google Inc.
21be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania// All rights reserved.
31be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania//
41be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania// Redistribution and use in source and binary forms, with or without
51be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania// modification, are permitted provided that the following conditions are
61be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania// met:
71be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania//
81be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania//     * Redistributions of source code must retain the above copyright
91be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania// notice, this list of conditions and the following disclaimer.
101be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania//     * Redistributions in binary form must reproduce the above
111be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania// copyright notice, this list of conditions and the following disclaimer
121be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania// in the documentation and/or other materials provided with the
131be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania// distribution.
141be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania//     * Neither the name of Google Inc. nor the names of its
151be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania// contributors may be used to endorse or promote products derived from
161be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania// this software without specific prior written permission.
171be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania//
181be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
191be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
201be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
211be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
221be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
231be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
241be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
251be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
261be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
271be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
281be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
291be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania
301be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania// Author: eefacm@gmail.com (Sean Mcafee)
311be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania
321be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania// Unit test for Google Test XML output.
331be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania//
341be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania// A user can specify XML output in a Google Test program to run via
351be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania// either the GTEST_OUTPUT environment variable or the --gtest_output
361be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania// flag.  This is used for testing such functionality.
371be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania//
381be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania// This program will be invoked from a Python unit test.  Don't run it
391be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania// directly.
401be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania
4141d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot#include "gtest/gtest.h"
421be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania
4341d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabotusing ::testing::InitGoogleTest;
4441d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabotusing ::testing::TestEventListeners;
4541d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabotusing ::testing::TestWithParam;
4641d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabotusing ::testing::UnitTest;
4741d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabotusing ::testing::Test;
4841d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabotusing ::testing::Types;
4941d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabotusing ::testing::Values;
5041d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot
5141d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabotclass SuccessfulTest : public Test {
521be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania};
531be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania
541be2c9def7187e4e643c00a31dd9986395795d7dNicolas CataniaTEST_F(SuccessfulTest, Succeeds) {
551be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  SUCCEED() << "This is a success.";
561be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  ASSERT_EQ(1, 1);
571be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania}
581be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania
5941d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabotclass FailedTest : public Test {
601be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania};
611be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania
621be2c9def7187e4e643c00a31dd9986395795d7dNicolas CataniaTEST_F(FailedTest, Fails) {
631be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  ASSERT_EQ(1, 2);
641be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania}
651be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania
6641d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabotclass DisabledTest : public Test {
671be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania};
681be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania
691be2c9def7187e4e643c00a31dd9986395795d7dNicolas CataniaTEST_F(DisabledTest, DISABLED_test_not_run) {
701be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  FAIL() << "Unexpected failure: Disabled test should not be run";
711be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania}
721be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania
731be2c9def7187e4e643c00a31dd9986395795d7dNicolas CataniaTEST(MixedResultTest, Succeeds) {
741be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  EXPECT_EQ(1, 1);
751be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  ASSERT_EQ(1, 1);
761be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania}
771be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania
781be2c9def7187e4e643c00a31dd9986395795d7dNicolas CataniaTEST(MixedResultTest, Fails) {
791be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  EXPECT_EQ(1, 2);
801be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  ASSERT_EQ(2, 3);
811be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania}
821be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania
831be2c9def7187e4e643c00a31dd9986395795d7dNicolas CataniaTEST(MixedResultTest, DISABLED_test) {
841be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  FAIL() << "Unexpected failure: Disabled test should not be run";
851be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania}
861be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania
8741d0579e8de9ef4ff178fc4991043c61a19943f7Brett ChabotTEST(XmlQuotingTest, OutputsCData) {
8841d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot  FAIL() << "XML output: "
8941d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot            "<?xml encoding=\"utf-8\"><top><![CDATA[cdata text]]></top>";
9041d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot}
9141d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot
9241d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot// Helps to test that invalid characters produced by test code do not make
9341d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot// it into the XML file.
9441d0579e8de9ef4ff178fc4991043c61a19943f7Brett ChabotTEST(InvalidCharactersTest, InvalidCharactersInMessage) {
9541d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot  FAIL() << "Invalid characters in brackets [\x1\x2]";
9641d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot}
9741d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot
9841d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabotclass PropertyRecordingTest : public Test {
991be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania};
1001be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania
1011be2c9def7187e4e643c00a31dd9986395795d7dNicolas CataniaTEST_F(PropertyRecordingTest, OneProperty) {
1021be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  RecordProperty("key_1", "1");
1031be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania}
1041be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania
1051be2c9def7187e4e643c00a31dd9986395795d7dNicolas CataniaTEST_F(PropertyRecordingTest, IntValuedProperty) {
1061be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  RecordProperty("key_int", 1);
1071be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania}
1081be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania
1091be2c9def7187e4e643c00a31dd9986395795d7dNicolas CataniaTEST_F(PropertyRecordingTest, ThreeProperties) {
1101be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  RecordProperty("key_1", "1");
1111be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  RecordProperty("key_2", "2");
1121be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  RecordProperty("key_3", "3");
1131be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania}
1141be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania
1151be2c9def7187e4e643c00a31dd9986395795d7dNicolas CataniaTEST_F(PropertyRecordingTest, TwoValuesForOneKeyUsesLastValue) {
1161be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  RecordProperty("key_1", "1");
1171be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  RecordProperty("key_1", "2");
1181be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania}
1191be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania
1201be2c9def7187e4e643c00a31dd9986395795d7dNicolas CataniaTEST(NoFixtureTest, RecordProperty) {
1211be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  RecordProperty("key", "1");
1221be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania}
1231be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania
1241be2c9def7187e4e643c00a31dd9986395795d7dNicolas Cataniavoid ExternalUtilityThatCallsRecordProperty(const char* key, int value) {
1251be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  testing::Test::RecordProperty(key, value);
1261be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania}
1271be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania
1281be2c9def7187e4e643c00a31dd9986395795d7dNicolas Cataniavoid ExternalUtilityThatCallsRecordProperty(const char* key,
1291be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania                                            const char* value) {
1301be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  testing::Test::RecordProperty(key, value);
1311be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania}
1321be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania
1331be2c9def7187e4e643c00a31dd9986395795d7dNicolas CataniaTEST(NoFixtureTest, ExternalUtilityThatCallsRecordIntValuedProperty) {
1341be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  ExternalUtilityThatCallsRecordProperty("key_for_utility_int", 1);
1351be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania}
1361be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania
1371be2c9def7187e4e643c00a31dd9986395795d7dNicolas CataniaTEST(NoFixtureTest, ExternalUtilityThatCallsRecordStringValuedProperty) {
1381be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  ExternalUtilityThatCallsRecordProperty("key_for_utility_string", "1");
1391be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania}
14041d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot
14141d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot// Verifies that the test parameter value is output in the 'value_param'
14241d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot// XML attribute for value-parameterized tests.
14341d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabotclass ValueParamTest : public TestWithParam<int> {};
14441d0579e8de9ef4ff178fc4991043c61a19943f7Brett ChabotTEST_P(ValueParamTest, HasValueParamAttribute) {}
14541d0579e8de9ef4ff178fc4991043c61a19943f7Brett ChabotTEST_P(ValueParamTest, AnotherTestThatHasValueParamAttribute) {}
14641d0579e8de9ef4ff178fc4991043c61a19943f7Brett ChabotINSTANTIATE_TEST_CASE_P(Single, ValueParamTest, Values(33, 42));
14741d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot
14841d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot// Verifies that the type parameter name is output in the 'type_param'
14941d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot// XML attribute for typed tests.
15041d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabottemplate <typename T> class TypedTest : public Test {};
15141d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabottypedef Types<int, long> TypedTestTypes;
15241d0579e8de9ef4ff178fc4991043c61a19943f7Brett ChabotTYPED_TEST_CASE(TypedTest, TypedTestTypes);
15341d0579e8de9ef4ff178fc4991043c61a19943f7Brett ChabotTYPED_TEST(TypedTest, HasTypeParamAttribute) {}
15441d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot
15541d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot// Verifies that the type parameter name is output in the 'type_param'
15641d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot// XML attribute for type-parameterized tests.
15741d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabottemplate <typename T> class TypeParameterizedTestCase : public Test {};
15841d0579e8de9ef4ff178fc4991043c61a19943f7Brett ChabotTYPED_TEST_CASE_P(TypeParameterizedTestCase);
15941d0579e8de9ef4ff178fc4991043c61a19943f7Brett ChabotTYPED_TEST_P(TypeParameterizedTestCase, HasTypeParamAttribute) {}
16041d0579e8de9ef4ff178fc4991043c61a19943f7Brett ChabotREGISTER_TYPED_TEST_CASE_P(TypeParameterizedTestCase, HasTypeParamAttribute);
16141d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabottypedef Types<int, long> TypeParameterizedTestCaseTypes;
16241d0579e8de9ef4ff178fc4991043c61a19943f7Brett ChabotINSTANTIATE_TYPED_TEST_CASE_P(Single,
16341d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot                              TypeParameterizedTestCase,
16441d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot                              TypeParameterizedTestCaseTypes);
16541d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot
16641d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabotint main(int argc, char** argv) {
16741d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot  InitGoogleTest(&argc, argv);
16841d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot
16941d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot  if (argc > 1 && strcmp(argv[1], "--shut_down_xml") == 0) {
17041d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot    TestEventListeners& listeners = UnitTest::GetInstance()->listeners();
17141d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot    delete listeners.Release(listeners.default_xml_generator());
17241d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot  }
17341d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot  return RUN_ALL_TESTS();
17441d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot}
175