Line Code
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 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237
/*
 *  friendlyname_t.cppunit.cc
 *  CMSSW
 *
 *  Created by Chris Jones on 8/8/05.
 *
 */

#include <catch.hpp>
#include <iostream>
#include "FWCore/Utilities/interface/FriendlyName.h"
#include <map>
#include <string>

using namespace edm;

TEST_CASE("friendlyName produces expected results", "[friendlyName]") {
  typedef std::pair<std::string, std::string> Values;
  std::map<std::string, std::string> classToFriendly;
  classToFriendly.insert(Values("Foo", "Foo"));
  classToFriendly.insert(Values("const Foo", "constFoo"));
  classToFriendly.insert(Values("bar::Foo", "barFoo"));
  classToFriendly.insert(Values("std::vector<Foo>", "Foos"));
  classToFriendly.insert(Values("std::vector<bar::Foo>", "barFoos"));
  classToFriendly.insert(Values("std::set<bar::Foo>", "barFoostdset"));
  classToFriendly.insert(Values("std::map<Foo, bar::Bar>", "FoobarBarstdmap"));
  classToFriendly.insert(Values("std::unordered_set<bar::Foo>", "barFoostduset"));
  classToFriendly.insert(Values("std::unordered_set<std::basic_string<char>>", "Stringstduset"));
  classToFriendly.insert(Values("std::unordered_set<bar::Foo, std::hash<bar::Foo>>", "barFoostduset"));
  classToFriendly.insert(
      Values("std::unordered_set<std::basic_string<char>, std::hash<std::basic_string<char>>>", "Stringstduset"));
  classToFriendly.insert(
      Values("std::unordered_set<bar::Foo, std::hash<bar::Foo>, std::equal_to<bar::Foo>>", "barFoostduset"));
  classToFriendly.insert(
      Values("std::unordered_set<std::basic_string<char>, std::hash<std::basic_string<char>>, "
             "std::equal_to<std::basic_string<char>>>",
             "Stringstduset"));
  classToFriendly.insert(
      Values("std::unordered_set<bar::Foo, CustomHash, std::equal_to<bar::Foo>>", "barFooCustomHashstduset"));
  classToFriendly.insert(
      Values("std::unordered_set<std::basic_string<char>, CustomHash, std::equal_to<std::basic_string<char>>>",
             "StringCustomHashstduset"));
  classToFriendly.insert(Values("std::unordered_set<bar::Foo, CustomHash>", "barFooCustomHashstduset"));
  classToFriendly.insert(Values("std::unordered_set<std::basic_string<char>, CustomHash>", "StringCustomHashstduset"));
  classToFriendly.insert(Values("std::unordered_map<Foo, bar::Bar>", "FoobarBarstdumap"));
  classToFriendly.insert(Values("std::unordered_map<std::basic_string<char>, bar::Bar>", "StringbarBarstdumap"));
  classToFriendly.insert(Values("std::unordered_map<Foo, std::basic_string<char>>", "FooStringstdumap"));
  classToFriendly.insert(Values("std::unordered_map<Foo, bar::Bar, std::hash<Foo>>", "FoobarBarstdumap"));
  classToFriendly.insert(
      Values("std::unordered_map<std::basic_string<char> , bar::Bar, std::hash<std::basic_string<char> > >",
             "StringbarBarstdumap"));
  classToFriendly.insert(
      Values("std::unordered_map<Foo, std::basic_string<char> , std::hash<Foo>>", "FooStringstdumap"));
  classToFriendly.insert(
      Values("std::unordered_map<Foo, bar::Bar, std::hash<Foo>, std::equal_to<Foo>>", "FoobarBarstdumap"));
  classToFriendly.insert(
      Values("std::unordered_map<std::basic_string<char>, bar::Bar, std::hash<std::basic_string<char>>, "
             "std::equal_to<std::basic_string<char>>>",
             "StringbarBarstdumap"));
  classToFriendly.insert(Values("std::unordered_map<Foo, std::basic_string<char>, std::hash<Foo>, std::equal_to<Foo>>",
                                "FooStringstdumap"));
  classToFriendly.insert(
      Values("std::unordered_map<Foo, bar::Bar, CustomHash, std::equal_to<Foo>>", "FoobarBarCustomHashstdumap"));
  classToFriendly.insert(Values(
      "std::unordered_map<std::basic_string<char>, bar::Bar, CustomHash, std::equal_to<std::basic_string<char>>>",
      "StringbarBarCustomHashstdumap"));
  classToFriendly.insert(Values("std::unordered_map<Foo, std::basic_string<char>, CustomHash, std::equal_to<Foo>>",
                                "FooStringCustomHashstdumap"));
  classToFriendly.insert(Values("std::unordered_map<Foo, bar::Bar, CustomHash>", "FoobarBarCustomHashstdumap"));
  classToFriendly.insert(
      Values("std::unordered_map<std::basic_string<char>, bar::Bar, CustomHash>", "StringbarBarCustomHashstdumap"));
  classToFriendly.insert(
      Values("std::unordered_map<Foo, std::basic_string<char>, CustomHash>", "FooStringCustomHashstdumap"));
  classToFriendly.insert(Values("std::shared_ptr<Foo>", "FooSharedPtr"));
  classToFriendly.insert(Values("std::shared_ptr<bar::Foo>", "barFooSharedPtr"));
  classToFriendly.insert(Values("std::basic_string<char>", "String"));
  classToFriendly.insert(Values("std::string", "String"));
  classToFriendly.insert(Values("std::__cxx11::basic_string<char>", "String"));
  classToFriendly.insert(Values("std::__cxx11::basic_string<char,std::char_traits<char> >", "String"));
  classToFriendly.insert(Values("std::list<int>", "intstdlist"));
  classToFriendly.insert(Values("std::__cxx11::list<int>", "intstdlist"));
  classToFriendly.insert(Values("std::vector<std::shared_ptr<bar::Foo>>", "barFooSharedPtrs"));
  classToFriendly.insert(Values("std::vector<std::basic_string<char>>", "Strings"));
  classToFriendly.insert(Values("std::__cxx11::vector<std::__cxx11::basic_string<char>>", "Strings"));
  classToFriendly.insert(Values("std::unique_ptr<Foo>", "FooUniquePtr"));
  classToFriendly.insert(Values("std::unique_ptr<bar::Foo>", "barFooUniquePtr"));
  classToFriendly.insert(Values("std::unique_ptr<const Foo>", "constFooUniquePtr"));
  classToFriendly.insert(Values("const std::unique_ptr<Foo>", "FooconstUniquePtr"));
  classToFriendly.insert(Values("std::unique_ptr<Foo,std::default_delete<Foo>>", "FooUniquePtr"));
  classToFriendly.insert(Values("std::unique_ptr<const Foo, std::default_delete<const Foo>>", "constFooUniquePtr"));
  classToFriendly.insert(
      Values("std::unique_ptr<std::unique_ptr<Bar,std::default_delete<Bar>>,std::default_delete<std::unique_ptr<Bar,"
             "std::default_delete<Bar>>>>",
             "BarUniquePtrUniquePtr"));
  classToFriendly.insert(Values("std::vector<std::unique_ptr<bar::Foo>>", "barFooUniquePtrs"));
  classToFriendly.insert(
      Values("std::vector<std::unique_ptr<bar::Foo, std::default_delete<bar::Foo>>>", "barFooUniquePtrs"));
  classToFriendly.insert(Values("std::vector<std::unique_ptr<const Foo>>", "constFooUniquePtrs"));
  classToFriendly.insert(
      Values("std::unique_ptr<std::vector<std::unique_ptr<bar::Foo>>>", "barFooUniquePtrsUniquePtr"));
  classToFriendly.insert(
      Values("std::unique_ptr<std::vector<std::unique_ptr<bar::Foo>>, "
             "std::default_delete<std::vector<std::unique_ptr<bar::Foo>>>>",
             "barFooUniquePtrsUniquePtr"));
  classToFriendly.insert(
      Values("std::unique_ptr<std::vector<std::unique_ptr<bar::Foo, std::default_delete<bar::Foo>>>>",
             "barFooUniquePtrsUniquePtr"));
  classToFriendly.insert(
      Values("std::unique_ptr<std::vector<std::unique_ptr<bar::Foo, std::default_delete<bar::Foo>>>, "
             "std::default_delete<std::vector<std::unique_ptr<bar::Foo, std::default_delete<bar::Foo>>>>>",
             "barFooUniquePtrsUniquePtr"));
  classToFriendly.insert(Values("V<A,B>", "ABV"));
  classToFriendly.insert(Values("edm::ExtCollection<std::vector<reco::SuperCluster>,reco::SuperClusterRefProds>",
                                "recoSuperClustersrecoSuperClusterRefProdsedmExtCollection"));
  classToFriendly.insert(
      Values("edm::SortedCollection<EcalUncalibratedRecHit,edm::StrictWeakOrdering<EcalUncalibratedRecHit> >",
             "EcalUncalibratedRecHitsSorted"));
  classToFriendly.insert(
      Values("edm::OwnVector<aod::Candidate,edm::ClonePolicy<aod::Candidate> >", "aodCandidatesOwned"));
  classToFriendly.insert(Values("edm::OwnVector<Foo,edm::ClonePolicy<Foo> >", "FoosOwned"));
  classToFriendly.insert(Values("edm::OwnVector<My<int>, edm::ClonePolicy<My<int> > >", "intMysOwned"));
  classToFriendly.insert(Values("std::vector<edm::OwnVector<My<int>, edm::ClonePolicy<My<int> > > >", "intMysOwneds"));
  classToFriendly.insert(
      Values("edm::Wrapper<MuonDigiCollection<CSCDetId,CSCALCTDigi> >", "CSCDetIdCSCALCTDigiMuonDigiCollection"));
  classToFriendly.insert(
      Values("edm::AssociationMap<edm::OneToMany<std::vector<CaloJet>,std::vector<reco::Track>,unsigned int> >",
             "CaloJetsToManyrecoTracksAssociation"));
  classToFriendly.insert(
      Values("edm::AssociationMap<edm::OneToOne<std::vector<reco::Track>,std::vector<reco::TrackInfo>,unsigned int> >",
             "recoTracksToOnerecoTrackInfosAssociation"));
  classToFriendly.insert(Values("edm::AssociationMap<edm::OneToValue<std::vector<reco::Electron>,float,unsigned int> >",
                                "recoElectronsToValuefloatAssociation"));
  classToFriendly.insert(
      Values("edm::AssociationMap<edm::OneToManyWithQuality<edm::OwnVector<reco::Candidate,edm::ClonePolicy<reco::"
             "Candidate> >,edm::OwnVector<reco::Candidate,edm::ClonePolicy<reco::Candidate> >,double,unsigned int> >",
             "recoCandidatesOwnedToManyrecoCandidatesOwnedWithQuantitydoubleAssociation"));
  classToFriendly.insert(
      Values("edm::AssociationVector<edm::RefProd<std::vector<reco::CaloJet> "
             ">,std::vector<int>,edm::Ref<std::vector<reco::CaloJet>,reco::CaloJet,edm::refhelper::FindUsingAdvance<"
             "std::vector<reco::CaloJet>,reco::CaloJet> >,unsigned int,edm::helper::AssociationIdenticalKeyReference>",
             "recoCaloJetsedmRefProdTointsAssociationVector"));
  classToFriendly.insert(
      Values("edm::AssociationVector<edm::RefProd<edm::OwnVector<reco::Candidate,edm::ClonePolicy<reco::Candidate> > "
             ">,std::vector<double>,edm::Ref<edm::OwnVector<reco::Candidate,edm::ClonePolicy<reco::Candidate> "
             ">,reco::Candidate,edm::refhelper::FindUsingAdvance<edm::OwnVector<reco::Candidate,edm::ClonePolicy<reco::"
             "Candidate> >,reco::Candidate> >,unsigned int,edm::helper::AssociationIdenticalKeyReference>",
             "recoCandidatesOwnededmRefProdTodoublesAssociationVector"));
  classToFriendly.insert(
      Values("edm::AssociationMap<edm::OneToOne<std::vector<reco::Track>,std::vector<std::pair<double,double> "
             ">,unsigned int> >",
             "recoTracksToOnedoubledoublestdpairsAssociation"));
  classToFriendly.insert(
      Values("edm::AssociationMap<edm::OneToOne<std::vector<reco::Track>,std::vector<std::pair<Point3DBase<float,"
             "GlobalTag>,GlobalErrorBase<double,ErrorMatrixTag> > >,unsigned int> >",
             "recoTracksToOnefloatGlobalTagPoint3DBasedoubleErrorMatrixTagGlobalErrorBasestdpairsAssociation"));
  classToFriendly.insert(Values("A<B<C>, D<E> >", "CBEDA"));
  classToFriendly.insert(Values("A<B<C<D> > >", "DCBA"));
  classToFriendly.insert(Values("A<B<C,D>, E<F> >", "CDBFEA"));
  classToFriendly.insert(Values("Aa<Bb<Cc>, Dd<Ee> >", "CcBbEeDdAa"));
  classToFriendly.insert(Values("Aa<Bb<Cc<Dd> > >", "DdCcBbAa"));
  classToFriendly.insert(Values("Aa<Bb<Cc,Dd>, Ee<Ff> >", "CcDdBbFfEeAa"));
  classToFriendly.insert(Values("Aa<Bb<Cc,Dd>, Ee<Ff,Gg> >", "CcDdBbFfGgEeAa"));
  classToFriendly.insert(
      Values("edm::RangeMap<DetId,edm::OwnVector<SiPixelRecHit,edm::ClonePolicy<SiPixelRecHit> "
             ">,edm::ClonePolicy<SiPixelRecHit> >",
             "DetIdSiPixelRecHitsOwnedRangeMap"));
  classToFriendly.insert(
      Values("std::vector<edm::RangeMap<DetId,edm::OwnVector<SiPixelRecHit,edm::ClonePolicy<SiPixelRecHit> "
             ">,edm::ClonePolicy<SiPixelRecHit> > >",
             "DetIdSiPixelRecHitsOwnedRangeMaps"));
  classToFriendly.insert(
      Values("edm::RefVector< edm::OwnVector<reco::Candidate,edm::ClonePolicy<reco::Candidate> >,reco::Candidate, "
             "edm::refhelper::FindUsingAdvance<edm::OwnVector<reco::Candidate,edm::ClonePolicy<reco::Candidate> >, "
             "reco::Candidate> >",
             "recoCandidatesOwnedRefs"));
  classToFriendly.insert(
      Values("edm::RefVector< std::vector<reco::Track>, reco::Track, "
             "edm::refhelper::FindUsingAdvance<std::vector<reco::Track>, reco::Track> >",
             "recoTracksRefs"));
  classToFriendly.insert(
      Values("edm::RefVector<Col, Type, edm::refhelper::FindUsingAdvance<Col, Type> >", "ColTypeRefs"));
  classToFriendly.insert(
      Values("edm::AssociationMap<edm::OneToMany<std::vector<reco::PixelMatchGsfElectron>,edm::SortedCollection<"
             "EcalRecHit,edm::StrictWeakOrdering<EcalRecHit> >,unsigned int> >",
             "recoPixelMatchGsfElectronsToManyEcalRecHitsSortedAssociation"));
  classToFriendly.insert(
      Values("edm::AssociationVector<edm::RefToBaseProd<reco::Candidate>,std::vector<double>,edm::RefToBase<reco::"
             "Candidate>,unsigned int,edm::helper::AssociationIdenticalKeyReference>",
             "recoCandidateedmRefToBaseProdTodoublesAssociationVector"));
  classToFriendly.insert(
      Values("edm::RefVector<edm::AssociationMap<edm::OneToOne<std::vector<reco::BasicCluster>,std::vector<reco::"
             "ClusterShape>,unsigned int> "
             ">,edm::helpers::KeyVal<edm::Ref<std::vector<reco::BasicCluster>,reco::BasicCluster,edm::refhelper::"
             "FindUsingAdvance<std::vector<reco::BasicCluster>,reco::BasicCluster> "
             ">,edm::Ref<std::vector<reco::ClusterShape>,reco::ClusterShape,edm::refhelper::FindUsingAdvance<std::"
             "vector<reco::ClusterShape>,reco::ClusterShape> > "
             ">,edm::AssociationMap<edm::OneToOne<std::vector<reco::BasicCluster>,std::vector<reco::ClusterShape>,"
             "unsigned int> >::Find>",
             "recoBasicClustersToOnerecoClusterShapesAssociationRefs"));
  classToFriendly.insert(
      Values("edmNew::DetSetVector<edm::Ref<edmNew::DetSetVector<SiPixelCluster>,SiPixelCluster,edmNew::DetSetVector<"
             "SiPixelCluster>::FindForDetSetVector> >",
             "SiPixelClusteredmNewDetSetVectorSiPixelClusterSiPixelClusteredmNewDetSetVectorFindForDetSetVectoredmRefed"
             "mNewDetSetVector"));
  classToFriendly.insert(
      Values("std::vector<std::pair<const pat::Muon *, TLorentzVector>>", "constpatMuonptrTLorentzVectorstdpairs"));
  classToFriendly.insert(Values("int[]", "intAs"));
  classToFriendly.insert(Values("foo<int[]>", "intAsfoo"));
  classToFriendly.insert(Values("bar<foo<int[]>>", "intAsfoobar"));

  // Alpaka types
  classToFriendly.insert(Values("alpaka::DevCpu", "alpakaDevCpu"));
  classToFriendly.insert(Values("alpaka::DevUniformCudaHipRt<alpaka::ApiCudaRt>", "alpakaDevCudaRt"));
  classToFriendly.insert(Values("alpaka::DevUniformCudaHipRt<alpaka::ApiHipRt>", "alpakaDevHipRt"));
  classToFriendly.insert(Values("alpaka::QueueGenericThreadsBlocking<alpaka::DevCpu>", "alpakaQueueCpuBlocking"));
  classToFriendly.insert(Values("alpaka::QueueGenericThreadsNonBlocking<alpaka::DevCpu>", "alpakaQueueCpuNonBlocking"));
  classToFriendly.insert(Values("alpaka::uniform_cuda_hip::detail::QueueUniformCudaHipRt<alpaka::ApiCudaRt,true>",
                                "alpakaQueueCudaRtBlocking"));
  classToFriendly.insert(Values("alpaka::uniform_cuda_hip::detail::QueueUniformCudaHipRt<alpaka::ApiCudaRt,false>",
                                "alpakaQueueCudaRtNonBlocking"));
  classToFriendly.insert(Values("alpaka::uniform_cuda_hip::detail::QueueUniformCudaHipRt<alpaka::ApiHipRt,true>",
                                "alpakaQueueHipRtBlocking"));
  classToFriendly.insert(Values("alpaka::uniform_cuda_hip::detail::QueueUniformCudaHipRt<alpaka::ApiHipRt,false>",
                                "alpakaQueueHipRtNonBlocking"));

  for (std::map<std::string, std::string>::iterator itInfo = classToFriendly.begin(), itInfoEnd = classToFriendly.end();
       itInfo != itInfoEnd;
       ++itInfo) {
    //std::cout <<itInfo->first<<std::endl;
    if (itInfo->second != edm::friendlyname::friendlyName(itInfo->first)) {
      std::cout << "class name: '" << itInfo->first << "' has wrong friendly name \n"
                << "expect: '" << itInfo->second << "' got: '" << edm::friendlyname::friendlyName(itInfo->first) << "'"
                << std::endl;
    }
    REQUIRE(itInfo->second == edm::friendlyname::friendlyName(itInfo->first));
  }
}