# Copyright (c) 2026 The WebRTC project authors. All Rights Reserved. # # Use of this source code is governed by a BSD-style license # that can be found in the LICENSE file in the root of the source # tree. An additional intellectual property rights grant can be found # in the file PATENTS. All contributing project authors may # be found in the AUTHORS file in the root of the source tree. import unittest from swap_gtest_args import is_constant, split_args, find_macro_calls class TestSwapGtestArgs(unittest.TestCase): def test_is_constant(self): # Numeric literals self.assertTrue(is_constant("0")) self.assertTrue(is_constant("123")) self.assertTrue(is_constant("0U")) self.assertTrue(is_constant("-1")) self.assertTrue(is_constant("0x10")) self.assertTrue(is_constant("0.5")) self.assertTrue(is_constant("1234")) # String literals self.assertTrue(is_constant('"foo"')) self.assertTrue(is_constant('""')) # Boolean literals self.assertTrue(is_constant("true")) self.assertTrue(is_constant("false")) # Nulls self.assertTrue(is_constant("nullptr")) self.assertTrue(is_constant("NULL")) self.assertTrue(is_constant("std::nullopt")) # k-prefixed self.assertTrue(is_constant("kAutoBandwidth")) self.assertTrue(is_constant("kAudioMid")) # Qualified enums self.assertTrue(is_constant("webrtc::MediaType::AUDIO")) self.assertTrue(is_constant("MediaProtocolType::kRtp")) self.assertTrue(is_constant("RtpTransceiverDirection::kRecvOnly")) # ALL_CAPS self.assertTrue(is_constant("ICE_UFRAG_LENGTH")) self.assertTrue(is_constant("GROUP_TYPE_BUNDLE")) # Casts self.assertTrue(is_constant("static_cast(0)")) self.assertTrue(is_constant("static_cast(kFoo)")) self.assertTrue(is_constant("size_t{kFoo}")) # Non-constants self.assertFalse(is_constant("acd->type()")) self.assertFalse(is_constant("ti_audio->description.ice_ufrag")) self.assertFalse(is_constant("vcd->codecs().size()")) self.assertFalse(is_constant("a + b")) def test_split_args(self): self.assertEqual(split_args("a, b"), ["a", " b"]) self.assertEqual(split_args("func(a, b), c"), ["func(a, b)", " c"]) self.assertEqual(split_args("std::vector{1, 2}, d"), ["std::vector{1, 2}", " d"]) self.assertEqual(split_args("\"string ending in backslash\\\""), ["\"string ending in backslash\\\""]) def test_find_macro_calls(self): content = 'EXPECT_EQ(0, x); ASSERT_NE(kFoo, y->bar());' calls = find_macro_calls(content) # find_macro_calls returns in reverse order of position self.assertEqual(len(calls), 2) self.assertEqual(calls[0][2], "ASSERT_NE") self.assertEqual(calls[1][2], "EXPECT_EQ") def test_complex_cases(self): content = """ EXPECT_EQ(webrtc::MediaType::AUDIO, acd->type()); EXPECT_EQ(0U, acd->first_ssrc()); EXPECT_EQ(kAutoBandwidth, acd->bandwidth()); EXPECT_EQ("opus", preferences[0].name); EXPECT_EQ(static_cast(ICE_UFRAG_LENGTH), ti_audio->description.ice_ufrag.size()); // Should not swap EXPECT_EQ(x, y); EXPECT_EQ(0, 1); EXPECT_GT(x, kFive); """ from swap_gtest_args import process_content updated = process_content(content) self.assertIn("EXPECT_EQ(acd->type(), webrtc::MediaType::AUDIO)", updated) self.assertIn("EXPECT_EQ(acd->first_ssrc(), 0U)", updated) self.assertIn("EXPECT_EQ(acd->bandwidth(), kAutoBandwidth)", updated) self.assertIn("EXPECT_EQ(preferences[0].name, \"opus\")", updated) self.assertIn( "EXPECT_EQ(ti_audio->description.ice_ufrag.size(), " "static_cast(ICE_UFRAG_LENGTH))", updated) self.assertIn("EXPECT_EQ(x, y)", updated) self.assertIn("EXPECT_EQ(0, 1)", updated) # Argument order dependent operators are not swapped. self.assertIn("EXPECT_GT(x, kFive)", updated) if __name__ == "__main__": unittest.main()