@@ -221,13 +221,16 @@ struct CoverageMappingTest : ::testing::TestWithParam<std::tuple<bool, bool>> {
221221 InputFunctions.back ().Expressions .push_back (CE);
222222 }
223223
224- std::string writeCoverageRegions (InputFunctionCoverageData &Data) {
224+ std::string writeCoverageRegions (InputFunctionCoverageData &Data,
225+ bool KeepMappingsOrder) {
225226 SmallVector<unsigned , 8 > FileIDs (Data.ReverseVirtualFileMapping .size ());
226227 for (const auto &E : Data.ReverseVirtualFileMapping )
227228 FileIDs[E.second ] = E.first ;
228229 std::string Coverage;
229230 llvm::raw_string_ostream OS (Coverage);
230- CoverageMappingWriter (FileIDs, Data.Expressions , Data.Regions ).write (OS);
231+ CoverageMappingWriter (FileIDs, Data.Expressions , Data.Regions ,
232+ KeepMappingsOrder)
233+ .write (OS);
231234 return OS.str ();
232235 }
233236
@@ -245,10 +248,12 @@ struct CoverageMappingTest : ::testing::TestWithParam<std::tuple<bool, bool>> {
245248 EXPECT_THAT_ERROR (Reader.read (), Succeeded ());
246249 }
247250
248- void writeAndReadCoverageRegions (bool EmitFilenames = true ) {
251+ void writeAndReadCoverageRegions (bool EmitFilenames = true ,
252+ bool KeepMappingsOrder = false ) {
249253 OutputFunctions.resize (InputFunctions.size ());
250254 for (unsigned I = 0 ; I < InputFunctions.size (); ++I) {
251- std::string Regions = writeCoverageRegions (InputFunctions[I]);
255+ std::string Regions =
256+ writeCoverageRegions (InputFunctions[I], KeepMappingsOrder);
252257 readCoverageRegions (Regions, OutputFunctions[I]);
253258 OutputFunctions[I].Name = InputFunctions[I].Name ;
254259 OutputFunctions[I].Hash = InputFunctions[I].Hash ;
@@ -316,6 +321,76 @@ TEST_P(CoverageMappingTest, basic_write_read) {
316321 }
317322}
318323
324+ TEST_P (CoverageMappingTest, SortMappings) {
325+ startFunction (" func" , 0x1234 );
326+ addMCDCDecisionCMR (3 , 2 , " file" , 7 , 1 , 7 , 12 );
327+ addMCDCBranchCMR (Counter::getCounter (0 ), Counter::getCounter (1 ), 0 , {-1 , 1 },
328+ " file" , 7 , 2 , 7 , 9 );
329+ addMCDCBranchCMR (Counter::getCounter (2 ), Counter::getCounter (3 ), 1 , {-1 , -1 },
330+ " file" , 7 , 11 , 7 , 12 );
331+ addMCDCDecisionCMR (7 , 3 , " file" , 7 , 2 , 7 , 9 );
332+ addMCDCBranchCMR (Counter::getCounter (0 ), Counter::getCounter (5 ), 0 , {-1 , 1 },
333+ " file" , 7 , 2 , 7 , 3 );
334+ addMCDCBranchCMR (Counter::getCounter (6 ), Counter::getCounter (7 ), 1 , {-1 , 2 },
335+ " file" , 7 , 5 , 7 , 6 );
336+ addMCDCBranchCMR (Counter::getCounter (8 ), Counter::getCounter (9 ), 2 , {-1 , -1 },
337+ " file" , 7 , 8 , 7 , 9 );
338+
339+ const std::vector<CounterMappingRegion> MappingsBeforeSourt =
340+ InputFunctions.back ().Regions ;
341+ writeAndReadCoverageRegions (true , false );
342+ ASSERT_EQ (1u , InputFunctions.size ());
343+ ASSERT_EQ (1u , OutputFunctions.size ());
344+ const auto &Input = MappingsBeforeSourt;
345+ const auto &Output = OutputFunctions.back ().Regions ;
346+
347+ size_t N = ArrayRef (Input).size ();
348+ llvm::SmallVector<std::tuple<size_t , size_t >> SortedMap = {
349+ {0 , 0 }, {3 , 1 }, {1 , 2 }, {4 , 3 }, {5 , 4 }, {6 , 5 }, {2 , 6 }};
350+ ASSERT_EQ (N, Output.size ());
351+ for (const auto &[InputIdx, OutputIdx] : SortedMap) {
352+ ASSERT_EQ (Input[InputIdx].Count , Output[OutputIdx].Count );
353+ ASSERT_EQ (Input[InputIdx].FileID , Output[OutputIdx].FileID );
354+ ASSERT_EQ (Input[InputIdx].startLoc (), Output[OutputIdx].startLoc ());
355+ ASSERT_EQ (Input[InputIdx].endLoc (), Output[OutputIdx].endLoc ());
356+ ASSERT_EQ (Input[InputIdx].Kind , Output[OutputIdx].Kind );
357+ }
358+ }
359+
360+ TEST_P (CoverageMappingTest, SkipMappingSorting) {
361+ startFunction (" func" , 0x1234 );
362+ addMCDCDecisionCMR (3 , 2 , " file" , 7 , 1 , 7 , 12 );
363+ addMCDCBranchCMR (Counter::getCounter (0 ), Counter::getCounter (1 ), 0 , {-1 , 1 },
364+ " file" , 7 , 2 , 7 , 9 );
365+ addMCDCBranchCMR (Counter::getCounter (2 ), Counter::getCounter (3 ), 1 , {-1 , -1 },
366+ " file" , 7 , 11 , 7 , 12 );
367+ addMCDCDecisionCMR (7 , 3 , " file" , 7 , 2 , 7 , 9 );
368+ addMCDCBranchCMR (Counter::getCounter (4 ), Counter::getCounter (5 ), 0 , {-1 , 1 },
369+ " file" , 7 , 2 , 7 , 3 );
370+ addMCDCBranchCMR (Counter::getCounter (6 ), Counter::getCounter (7 ), 1 , {-1 , 2 },
371+ " file" , 7 , 5 , 7 , 6 );
372+ addMCDCBranchCMR (Counter::getCounter (8 ), Counter::getCounter (9 ), 2 , {-1 , -1 },
373+ " file" , 7 , 8 , 7 , 9 );
374+
375+ const std::vector<CounterMappingRegion> MappingsBeforeSourt =
376+ InputFunctions.back ().Regions ;
377+ writeAndReadCoverageRegions (true , true );
378+ ASSERT_EQ (1u , InputFunctions.size ());
379+ ASSERT_EQ (1u , OutputFunctions.size ());
380+ const auto &Input = MappingsBeforeSourt;
381+ const auto &Output = OutputFunctions.back ().Regions ;
382+
383+ size_t N = ArrayRef (Input).size ();
384+ ASSERT_EQ (N, Output.size ());
385+ for (size_t I = 0 ; I < N; ++I) {
386+ ASSERT_EQ (Input[I].Count , Output[I].Count );
387+ ASSERT_EQ (Input[I].FileID , Output[I].FileID );
388+ ASSERT_EQ (Input[I].startLoc (), Output[I].startLoc ());
389+ ASSERT_EQ (Input[I].endLoc (), Output[I].endLoc ());
390+ ASSERT_EQ (Input[I].Kind , Output[I].Kind );
391+ }
392+ }
393+
319394TEST_P (CoverageMappingTest, correct_deserialize_for_more_than_two_files) {
320395 const char *FileNames[] = {" bar" , " baz" , " foo" };
321396 static const unsigned N = std::size (FileNames);
0 commit comments