Imported Upstream version 17.23.5
[platform/upstream/libzypp.git] / tests / sat / SolvableSpec_test.cc
1 #include <stdio.h>
2 #include <iostream>
3 #include <boost/test/unit_test.hpp>
4
5 #include <zypp/sat/SolvableSpec.h>
6 #include <zypp/base/Logger.h>
7 #include "TestSetup.h"
8
9 #define BOOST_CHECK_MODULE SolvableSpec
10
11 using std::cout;
12 using std::endl;
13 using std::string;
14 using namespace zypp;
15 using namespace boost::unit_test;
16
17
18 BOOST_AUTO_TEST_CASE(parsing)
19 {
20   {
21     sat::SolvableSpec specs;
22     // adds no empty values
23     specs.addIdent   ( IdString() );
24     specs.addIdent   ( IdString( "" ) );
25     specs.addProvides( Capability() );
26     specs.addProvides( Capability( "" ) );
27     BOOST_CHECK( ! specs.containsIdent( IdString() ) );
28     BOOST_CHECK( ! specs.containsProvides( Capability() ) );
29     BOOST_CHECK( ! specs.containsIdent( IdString( "" ) ) );
30     BOOST_CHECK( ! specs.containsProvides( Capability( "" ) ) );
31   }
32   {
33     sat::SolvableSpec specs;
34     specs.addIdent   ( IdString( "idstr" ) );
35     specs.addProvides( Capability( "idcap" ) );
36     specs.addProvides( Capability( "idvcap=13" ) );
37     specs.addProvides( Capability( "idvwcap = 14" ) );
38     BOOST_CHECK( specs.containsIdent   ( IdString( "idstr" ) ) );
39     BOOST_CHECK( specs.containsProvides( Capability( "", "idcap", "", "" ) ) );
40     BOOST_CHECK( specs.containsProvides( Capability( "", "idvcap", "=", "13" ) ) );
41     BOOST_CHECK( specs.containsProvides( Capability( "", "idvwcap", "=", "14" ) ) );
42   }
43   {
44     sat::SolvableSpec specs;
45     specs.parse( "idstr" );
46     specs.parse( "provides:idcap" );
47     specs.parse( "provides:idvcap=13" );
48     specs.parse( "provides:idvwcap = 14" );
49     BOOST_CHECK( specs.containsIdent   ( IdString( "idstr" ) ) );
50     BOOST_CHECK( specs.containsProvides( Capability( "", "idcap", "", "" ) ) );
51     BOOST_CHECK( specs.containsProvides( Capability( "", "idvcap", "=", "13" ) ) );
52     BOOST_CHECK( specs.containsProvides( Capability( "", "idvwcap", "=", "14" ) ) );
53   }
54   {
55     sat::SolvableSpec specs;
56     std::stringstream str;
57     str << "# some comment" << endl;
58     str << "  # maybe indented" << endl;
59     str << "  \t   " << endl;   // white line
60     str << " idstr " << endl;
61       str << " provides:idcap  " << endl;
62     str << " provides:idvcap=13 " << endl;
63     str << " provides:idvwcap = 14 " << endl;
64     str << "" << endl;
65     specs.parseFrom( str );
66     BOOST_CHECK( specs.containsIdent   ( IdString( "idstr" ) ) );
67     BOOST_CHECK( specs.containsProvides( Capability( "", "idcap", "", "" ) ) );
68     BOOST_CHECK( specs.containsProvides( Capability( "", "idvcap", "=", "13" ) ) );
69     BOOST_CHECK( specs.containsProvides( Capability( "", "idvwcap", "=", "14" ) ) );
70   }
71   {
72     sat::SolvableSpec specs;
73     specs.splitParseFrom( "idstr  provides:idcap  provides:idvcap=13  provides:idvwcap\\ =\\ 14  id\\ ws\\ str  provides:id\\ ws\\ cap\\ =\\ 99" );
74     BOOST_CHECK( specs.containsIdent   ( IdString( "idstr" ) ) );
75     BOOST_CHECK( specs.containsProvides( Capability( "", "idcap", "", "" ) ) );
76     BOOST_CHECK( specs.containsProvides( Capability( "", "idvcap", "=", "13" ) ) );
77     BOOST_CHECK( specs.containsProvides( Capability( "", "idvwcap", "=", "14" ) ) );
78     BOOST_CHECK( specs.containsIdent   ( IdString( "id ws str" ) ) );
79     BOOST_CHECK( specs.containsProvides( Capability( "", "id ws cap", "=", "99" ) ) );
80   }
81 }
82
83 BOOST_AUTO_TEST_CASE(eval)
84 {
85   sat::SolvableSpec specs;
86   specs.parse( "candidate" );
87   BOOST_CHECK( !specs.dirty() );        // ident don't
88   specs.parse( "provides:available_only > 1-1" );
89   BOOST_CHECK( specs.dirty() );         // deps do
90
91   TestSetup test( Arch_x86_64 );
92   test.loadTestcaseRepos( TESTS_SRC_DIR "/data/TCSelectable" );
93   std::set<sat::Solvable::IdType> matches {2,3,8,9,14,15,16,17,28};     // matching Solvable IDs in TestcaseRepo (does not match srcpackage:!)
94   for ( const auto & solv : ResPool::instance() )
95   {
96     //cout << ( specs.contains( solv ) ? "* " : "  " ) << solv << endl;
97     BOOST_CHECK_MESSAGE( specs.contains( solv ) == matches.count( solv.id() ), str::Str() << "Wrong: " << ( specs.contains( solv ) ? "* " : "  " ) << solv );
98   }
99
100   BOOST_CHECK( !specs.dirty() );        // loop built the cache
101   specs.parse( "provides:available_only > 1-1" );
102   BOOST_CHECK( !specs.dirty() );        // already have this spec, no need to set dirty
103
104   specs.parse( "provides:available_only = 1-1" );
105   BOOST_CHECK( specs.dirty() );         // This is a new one, so got dirty
106   matches.insert( 13 );
107
108   for ( const auto & solv : ResPool::instance() )
109   {
110     BOOST_CHECK_MESSAGE( specs.contains( solv ) == matches.count( solv.id() ), str::Str() << "Wrong: " << ( specs.contains( solv ) ? "* " : "  " ) << solv );
111   }
112 }