pikabuka

Tests

Feb 15th, 2022
1,633
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 21.91 KB | None | 0 0
  1. #include <algorithm>
  2. #include <cassert>
  3. #include <cmath>
  4. #include <map>
  5. #include <set>
  6. #include <string>
  7. #include <utility>
  8. #include <vector>
  9. #include <iostream>
  10.  
  11. using namespace std;
  12.  
  13. /* Подставьте вашу реализацию класса SearchServer сюда */
  14. /*
  15. const int MAX_RESULT_DOCUMENT_COUNT = 5;
  16.  
  17. string ReadLine() {
  18.     string s;
  19.     getline(cin, s);
  20.     return s;
  21. }
  22.  
  23. int ReadLineWithNumber() {
  24.     int result;
  25.     cin >> result;
  26.     ReadLine();
  27.     return result;
  28. }
  29.  
  30. vector<string> SplitIntoWords(const string& text) {
  31.     vector<string> words;
  32.     string word;
  33.     for (const char c : text) {
  34.         if (c == ' ') {
  35.             if (!word.empty()) {
  36.                 words.push_back(word);
  37.                 word.clear();
  38.             }
  39.         } else {
  40.             word += c;
  41.         }
  42.     }
  43.     if (!word.empty()) {
  44.         words.push_back(word);
  45.     }
  46.  
  47.     return words;
  48. }
  49.  
  50.  
  51. struct Document {
  52.     int id;
  53.     double relevance;
  54.     int rating;
  55. };
  56.  
  57. enum class DocumentStatus {
  58.     ACTUAL,
  59.     IRRELEVANT,
  60.     BANNED,
  61.     REMOVED,
  62. };
  63.  
  64. class SearchServer {
  65. public:
  66.     void SetStopWords(const string& text) {
  67.         for (const string& word : SplitIntoWords(text)) {
  68.             stop_words_.insert(word);
  69.         }
  70.     }    
  71.    
  72.     void AddDocument(int document_id, const string& document, DocumentStatus status, const vector<int>& ratings) {
  73.         const vector<string> words = SplitIntoWordsNoStop(document);
  74.         const double inv_word_count = 1.0 / words.size();
  75.         for (const string& word : words) {
  76.             word_to_document_freqs_[word][document_id] += inv_word_count;
  77.         }
  78.         documents_.emplace(document_id,
  79.             DocumentData{
  80.                 ComputeAverageRating(ratings),
  81.                 status
  82.             });
  83.     }
  84.    
  85.     template <typename DocumentPredicate>
  86.     vector<Document> FindTopDocuments(const string& raw_query, DocumentPredicate document_predicate) const {            
  87.         const Query query = ParseQuery(raw_query);
  88.         auto matched_documents = FindAllDocuments(query, document_predicate);
  89.        
  90.         sort(matched_documents.begin(), matched_documents.end(),
  91.              [](const Document& lhs, const Document& rhs) {
  92.                 if (abs(lhs.relevance - rhs.relevance) < 1e-6) {
  93.                     return lhs.rating > rhs.rating;
  94.                 } else {
  95.                     return lhs.relevance > rhs.relevance;
  96.                 }
  97.              });
  98.         if (matched_documents.size() > MAX_RESULT_DOCUMENT_COUNT) {
  99.             matched_documents.resize(MAX_RESULT_DOCUMENT_COUNT);
  100.         }
  101.         return matched_documents;
  102.     }
  103.  
  104.     vector<Document> FindTopDocuments(const string& raw_query, DocumentStatus status) const {
  105.         return FindTopDocuments(raw_query, [status](int document_id, DocumentStatus document_status, int rating) { document_id += rating ;
  106.                 return document_status == status;
  107.             });
  108.     }
  109.  
  110.     vector<Document> FindTopDocuments(const string& raw_query) const {            
  111.         return FindTopDocuments(raw_query, DocumentStatus::ACTUAL);
  112.     }
  113.  
  114.     int GetDocumentCount() const {
  115.         return documents_.size();
  116.     }
  117.    
  118.     tuple<vector<string>, DocumentStatus> MatchDocument(const string& raw_query, int document_id) const {
  119.         const Query query = ParseQuery(raw_query);
  120.         vector<string> matched_words;
  121.         for (const string& word : query.plus_words) {
  122.             if (word_to_document_freqs_.count(word) == 0) {
  123.                 continue;
  124.             }
  125.             if (word_to_document_freqs_.at(word).count(document_id)) {
  126.                 matched_words.push_back(word);
  127.             }
  128.         }
  129.         for (const string& word : query.minus_words) {
  130.             if (word_to_document_freqs_.count(word) == 0) {
  131.                 continue;
  132.             }
  133.             if (word_to_document_freqs_.at(word).count(document_id)) {
  134.                 matched_words.clear();
  135.                 break;
  136.             }
  137.         }
  138.         return {matched_words, documents_.at(document_id).status};
  139.     }
  140.    
  141. private:
  142.     struct DocumentData {
  143.         int rating;
  144.         DocumentStatus status;
  145.     };
  146.  
  147.     set<string> stop_words_;
  148.     map<string, map<int, double>> word_to_document_freqs_;
  149.     map<int, DocumentData> documents_;
  150.    
  151.     bool IsStopWord(const string& word) const {
  152.         return stop_words_.count(word) > 0;
  153.     }
  154.    
  155.     vector<string> SplitIntoWordsNoStop(const string& text) const {
  156.         vector<string> words;
  157.         for (const string& word : SplitIntoWords(text)) {
  158.             if (!IsStopWord(word)) {
  159.                 words.push_back(word);
  160.             }
  161.         }
  162.         return words;
  163.     }
  164.    
  165.     static int ComputeAverageRating(const vector<int>& ratings) {
  166.         if (ratings.empty()) {
  167.             return 0;
  168.         }
  169.         int rating_sum = 0;
  170.         for (const int rating : ratings) {
  171.             rating_sum += rating;
  172.         }
  173.         return rating_sum / static_cast<int>(ratings.size());
  174.     }
  175.    
  176.     struct QueryWord {
  177.         string data;
  178.         bool is_minus;
  179.         bool is_stop;
  180.     };
  181.    
  182.     QueryWord ParseQueryWord(string text) const {
  183.         bool is_minus = false;
  184.         // Word shouldn't be empty
  185.         if (text[0] == '-') {
  186.             is_minus = true;
  187.             text = text.substr(1);
  188.         }
  189.         return {
  190.             text,
  191.             is_minus,
  192.             IsStopWord(text)
  193.         };
  194.     }
  195.    
  196.     struct Query {
  197.         set<string> plus_words;
  198.         set<string> minus_words;
  199.     };
  200.    
  201.     Query ParseQuery(const string& text) const {
  202.         Query query;
  203.         for (const string& word : SplitIntoWords(text)) {
  204.             const QueryWord query_word = ParseQueryWord(word);
  205.             if (!query_word.is_stop) {
  206.                 if (query_word.is_minus) {
  207.                     query.minus_words.insert(query_word.data);
  208.                 } else {
  209.                     query.plus_words.insert(query_word.data);
  210.                 }
  211.             }
  212.         }
  213.         return query;
  214.     }
  215.    
  216.     // Existence required
  217.     double ComputeWordInverseDocumentFreq(const string& word) const {
  218.         return log(GetDocumentCount() * 1.0 / word_to_document_freqs_.at(word).size());
  219.     }
  220.    
  221.     template <typename LambdaType>
  222.     vector<Document> FindAllDocuments(const Query& query, LambdaType lambda_function) const {
  223.         map<int, double> document_to_relevance;
  224.         for (const string& word : query.plus_words) {
  225.             if (word_to_document_freqs_.count(word) == 0) {
  226.                 continue;
  227.             }
  228.             const double inverse_document_freq = ComputeWordInverseDocumentFreq(word);
  229.             for (const auto [document_id, term_freq] : word_to_document_freqs_.at(word)) {
  230.                 if (lambda_function(document_id, documents_.at(document_id).status, documents_.at(document_id).rating)) {
  231.                     document_to_relevance[document_id] += term_freq * inverse_document_freq;
  232.                 }
  233.                
  234.             }
  235.         }
  236.        
  237.         for (const string& word : query.minus_words) {
  238.             if (word_to_document_freqs_.count(word) == 0) {
  239.                 continue;
  240.             }
  241.             for (const auto [document_id, _] : word_to_document_freqs_.at(word)) {
  242.                 document_to_relevance.erase(document_id);
  243.             }
  244.         }
  245.  
  246.         vector<Document> matched_documents;
  247.         for (const auto [document_id, relevance] : document_to_relevance) {
  248.             matched_documents.push_back({
  249.                 document_id,
  250.                 relevance,
  251.                 documents_.at(document_id).rating
  252.             });
  253.         }
  254.         return matched_documents;
  255.     }
  256. };
  257.  
  258. */
  259.  
  260. // -------- Начало модульных тестов поисковой системы ----------
  261.  
  262. // Тест проверяет, что поисковая система исключает стоп-слова при добавлении документов
  263. void TestExcludeStopWordsFromAddedDocumentContent() {
  264.     const int doc_id = 42;
  265.     const string content = "cat in the city"s;
  266.     const vector<int> ratings = {1, 2, 3};
  267.     // Сначала убеждаемся, что поиск слова, не входящего в список стоп-слов,
  268.     // находит нужный документ
  269.     {
  270.         SearchServer server;
  271.         server.AddDocument(doc_id, content, DocumentStatus::ACTUAL, ratings);
  272.         const auto found_docs = server.FindTopDocuments("in"s);
  273.         assert(found_docs.size() == 1);
  274.         const Document& doc0 = found_docs[0];
  275.         assert(doc0.id == doc_id);
  276.     }
  277.  
  278.     // Затем убеждаемся, что поиск этого же слова, входящего в список стоп-слов,
  279.     // возвращает пустой результат
  280.     {
  281.         SearchServer server;
  282.         server.SetStopWords("in the"s);
  283.         server.AddDocument(doc_id, content, DocumentStatus::ACTUAL, ratings);
  284.         assert(server.FindTopDocuments("in"s).empty());
  285.     }
  286. }
  287.  
  288.  
  289.  
  290.  
  291. /*
  292. Разместите код остальных тестов здесь
  293. */
  294.  
  295. // Тест проверяет, что добавленный документ находится по поисковому запросу, который содержит слова из документа.
  296. void TestDocumentsAdding() {
  297.     const int doc_id = 42;
  298.     const string content = "cat in the city"s;
  299.     const vector<int> ratings = {1, 2, 3};
  300.     // Сначала убеждаемся, что поиск слова, не входящего в список стоп-слов,
  301.     // находит нужный документ
  302.     {
  303.         SearchServer server;
  304.         server.AddDocument(doc_id, content, DocumentStatus::ACTUAL, ratings);
  305.         const auto found_docs = server.FindTopDocuments("cat"s);
  306.         assert(found_docs.size() == 1);
  307.         const Document& doc0 = found_docs[0];
  308.         assert(doc0.id == doc_id);
  309.     }
  310.  
  311.     // Затем убеждаемся, что поиск слова не из документа,
  312.     // возвращает пустой результат
  313.     {
  314.         SearchServer server;
  315.         server.AddDocument(doc_id, content, DocumentStatus::ACTUAL, ratings);
  316.         const auto found_docs = server.FindTopDocuments("dog near red town"s);
  317.         assert(found_docs.empty());
  318.     }
  319. }
  320.  
  321.  
  322. void TestStopWordsSupporting() {
  323.     const int doc_id = 42;
  324.     const string content = "cat in the city"s;
  325.     const string stop_words = "in the"s;
  326.     const vector<int> ratings = {1, 2, 3};
  327.    
  328.     // Сначала убеждаемся, что Стоп-слова исключаются из текста документов
  329.    
  330.     {
  331.         SearchServer server;
  332.         server.SetStopWords(stop_words);
  333.         server.AddDocument(doc_id, content, DocumentStatus::ACTUAL, ratings);
  334.         assert(server.FindTopDocuments("in the town"s).empty());
  335.     }
  336.    
  337.     {
  338.         SearchServer server;
  339.         server.SetStopWords(stop_words);
  340.         server.AddDocument(doc_id, content, DocumentStatus::ACTUAL, ratings);
  341.         const auto found_docs = server.FindTopDocuments("in the city"s);
  342.         assert(found_docs.size() == 1);
  343.         const Document& doc0 = found_docs[0];
  344.         assert(doc0.id == doc_id);
  345.     }
  346.  
  347. }
  348.  
  349. void TestMinusWordsSupporting() {
  350.     const int doc_id = 42;
  351.     const string content = "cat in the city"s;
  352.     const vector<int> ratings = {1, 2, 3};
  353.    
  354.     // Сначала убеждаемся, что Стоп-слова исключаются из текста документов
  355.    
  356.     {
  357.         SearchServer server;
  358.         server.AddDocument(doc_id, content, DocumentStatus::ACTUAL, ratings);
  359.         assert(server.FindTopDocuments("in the -city"s).empty());
  360.     }
  361.    
  362.     {
  363.         SearchServer server;
  364.         server.AddDocument(doc_id, content, DocumentStatus::ACTUAL, ratings);
  365.         const auto found_docs = server.FindTopDocuments("in the city"s);
  366.         assert(found_docs.size() == 1);
  367.         const Document& doc0 = found_docs[0];
  368.         assert(doc0.id == doc_id);
  369.     }
  370.  
  371. }
  372.  
  373.  
  374. void TestMatching() {
  375.     const int doc_id = 42;
  376.     const string content = "cat in the city"s;
  377.     const vector<int> ratings = {1, 2, 3};
  378.    
  379.     // Сначала убеждаемся, что Стоп-слова исключаются из текста документов
  380.    
  381.     {
  382.         SearchServer server;
  383.         server.AddDocument(doc_id, content, DocumentStatus::ACTUAL, ratings);
  384.         auto [v, ds] = server.MatchDocument("dog in the big city"s, doc_id);
  385.         assert(v.size() == 3);
  386.     }
  387.    
  388.     {
  389.         SearchServer server;
  390.         server.AddDocument(doc_id, content, DocumentStatus::ACTUAL, ratings);
  391.         auto [v, ds] = server.MatchDocument("dog in the big -city"s, doc_id);
  392.         assert(v.empty());
  393.     }
  394. }
  395.  
  396. void TestRelevanceSorting() {
  397.  
  398.     // Сначала убеждаемся, что релевантность отсортирована по убыванию
  399.    
  400.     {
  401.         const int doc_id_1 = 42;
  402.         const string content_1 = "cat in the city city city"s;
  403.         const vector<int> ratings_1 = {1, 2, 3};
  404.  
  405.         const int doc_id_2 = 43;
  406.         const string content_2 = "fox fox the city city city"s;
  407.         const vector<int> ratings_2 = {4, 5, 6};
  408.  
  409.         const int doc_id_3 = 44;
  410.         const string content_3 = "dog dog dog in the city"s;
  411.         const vector<int> ratings_3 = {2, 4, 2};
  412.  
  413.         SearchServer server;
  414.         server.AddDocument(doc_id_1, content_1, DocumentStatus::ACTUAL, ratings_1);
  415.         server.AddDocument(doc_id_2, content_2, DocumentStatus::ACTUAL, ratings_2);
  416.         server.AddDocument(doc_id_3, content_3, DocumentStatus::ACTUAL, ratings_3);
  417.         const auto found_docs = server.FindTopDocuments("cat fox dog"s);
  418.         assert(found_docs.size() == 3);
  419.         assert(found_docs[0].id == doc_id_3);
  420.         assert(found_docs[1].id == doc_id_2);
  421.         assert(found_docs[2].id == doc_id_1);
  422.     }
  423.    
  424.     {
  425.         const int doc_id_1 = 52;
  426.         const string content_1 = "cat fox dog in the city"s;
  427.         const vector<int> ratings_1 = {1, 2, 3};
  428.  
  429.         const int doc_id_2 = 53;
  430.         const string content_2 = "fox dog the city city city"s;
  431.         const vector<int> ratings_2 = {4, 5, 6};
  432.  
  433.         const int doc_id_3 = 54;
  434.         const string content_3 = "dog in the city city city"s;
  435.         const vector<int> ratings_3 = {2, 4, 2};
  436.  
  437.         SearchServer server;
  438.         server.AddDocument(doc_id_1, content_1, DocumentStatus::ACTUAL, ratings_1);
  439.         server.AddDocument(doc_id_2, content_2, DocumentStatus::ACTUAL, ratings_2);
  440.         server.AddDocument(doc_id_3, content_3, DocumentStatus::ACTUAL, ratings_3);
  441.         const auto found_docs = server.FindTopDocuments("cat fox dog"s);
  442.         assert(found_docs.size() == 3);
  443.         assert(found_docs[0].id == doc_id_1);
  444.         assert(found_docs[1].id == doc_id_2);
  445.         assert(found_docs[2].id == doc_id_3);
  446.     }
  447.  
  448.    
  449. }
  450.  
  451. void TestRating() {
  452.  
  453.     // Сначала убеждаемся, что релевантность отсортирована по убыванию
  454.    
  455.     {
  456.         const int doc_id_1 = 42;
  457.         const string content_1 = "cat in the city city city"s;
  458.         const vector<int> ratings_1 = {1, 2, 3};
  459.  
  460.         SearchServer server;
  461.         server.AddDocument(doc_id_1, content_1, DocumentStatus::ACTUAL, ratings_1);
  462.         const auto found_docs = server.FindTopDocuments("cat fox dog"s);
  463.         assert(!found_docs.empty());
  464.         assert(found_docs[0].rating == round((1+2+3+0.0)/3));
  465.     }
  466. }
  467.  
  468. void TestLambdaFilter() {
  469.  
  470.     // Сначала убеждаемся, что релевантность отсортирована по убыванию
  471.     const int doc_id = 42;
  472.     const string content = "cat in the city city city"s;
  473.     const vector<int> ratings = {1, 2, 3};
  474.     const DocumentStatus document_status = DocumentStatus::ACTUAL;
  475.    
  476.     {
  477.         SearchServer server;
  478.         server.AddDocument(doc_id, content, document_status, ratings);
  479.         const auto found_docs = server.FindTopDocuments("cat fox dog"s, DocumentStatus::ACTUAL);
  480.         assert(!found_docs.empty());
  481.         assert(found_docs[0].id == doc_id);
  482.     }
  483.  
  484.     {
  485.         SearchServer server;
  486.         server.AddDocument(doc_id, content, DocumentStatus::BANNED, ratings);
  487.         const auto found_docs = server.FindTopDocuments("cat fox dog"s, DocumentStatus::ACTUAL);
  488.         assert(found_docs.empty());
  489.     }
  490.  
  491.     {
  492.         SearchServer server;
  493.         server.AddDocument(doc_id, content, document_status, ratings);
  494.         const auto found_docs = server.FindTopDocuments("cat fox dog"s, [] (int document_id, DocumentStatus status, int rating) {
  495.             document_id +=1;
  496.             if (status == DocumentStatus::ACTUAL) {document_id +=1;};
  497.             return rating > 1;
  498.         });
  499.         assert(!found_docs.empty());
  500.         assert(found_docs[0].id == doc_id);
  501.     }
  502.  
  503.     {
  504.         SearchServer server;
  505.         server.AddDocument(doc_id, content, document_status, ratings);
  506.         const auto found_docs = server.FindTopDocuments("cat fox dog"s, [] (int document_id, DocumentStatus status, int rating) {
  507.                      document_id +=1;
  508.                      if (status == DocumentStatus::ACTUAL) {document_id +=1;};
  509.                      return rating > 3;
  510.         });
  511.         assert(found_docs.empty());
  512.     }
  513.  
  514. }
  515.  
  516. void TestStatus() {
  517.  
  518.     // Сначала убеждаемся, что релевантность отсортирована по убыванию
  519.     const int doc_id = 42;
  520.     const string content = "cat in the city city city"s;
  521.     const vector<int> ratings = {1, 2, 3};
  522.     const DocumentStatus document_status = DocumentStatus::BANNED;
  523.    
  524.     {
  525.         SearchServer server;
  526.         server.AddDocument(doc_id, content, document_status, ratings);
  527.         const auto found_docs = server.FindTopDocuments("cat fox dog"s, DocumentStatus::ACTUAL);
  528.         assert(found_docs.empty());
  529.     }
  530.  
  531.     {
  532.         SearchServer server;
  533.         server.AddDocument(doc_id, content, DocumentStatus::BANNED, ratings);
  534.         const auto found_docs = server.FindTopDocuments("cat fox dog"s, DocumentStatus::BANNED);
  535.         assert(!found_docs.empty());
  536.         assert(found_docs[0].id == doc_id);
  537.     }
  538.  
  539.  
  540. }
  541.  
  542. void TestRelevanceAccuracy() {
  543.  
  544.     // Сначала убеждаемся, что релевантность отсортирована по убыванию
  545.    
  546.     {
  547.         const int doc_id_1 = 42;
  548.         const string content_1 = "cat in the city city city"s;
  549.         const vector<int> ratings_1 = {1, 2, 3};
  550.  
  551.         const int doc_id_2 = 43;
  552.         const string content_2 = "fox fox the city city city"s;
  553.         const vector<int> ratings_2 = {4, 5, 6};
  554.  
  555.         const int doc_id_3 = 44;
  556.         const string content_3 = "dog dog dog in the city"s;
  557.         const vector<int> ratings_3 = {2, 4, 2};
  558.  
  559.         SearchServer server;
  560.         server.AddDocument(doc_id_1, content_1, DocumentStatus::ACTUAL, ratings_1);
  561.         server.AddDocument(doc_id_2, content_2, DocumentStatus::ACTUAL, ratings_2);
  562.         server.AddDocument(doc_id_3, content_3, DocumentStatus::ACTUAL, ratings_3);
  563.         const auto found_docs = server.FindTopDocuments("cat fox dog"s);
  564.         assert(found_docs.size() == 3);
  565.         assert(found_docs[0].id == doc_id_3);
  566.         assert(abs(found_docs[0].relevance - log(3)/2) < 1e-6);
  567.         assert(found_docs[1].id == doc_id_2);
  568.         assert(abs(found_docs[1].relevance - log(3)/3) < 1e-6);
  569.         assert(found_docs[2].id == doc_id_1);
  570.         assert(abs(found_docs[2].relevance - log(3)/6) < 1e-6);
  571.     }
  572.    
  573.     {
  574.         const int doc_id_1 = 52;
  575.         const string content_1 = "cat fox dog in the city"s;
  576.         const vector<int> ratings_1 = {1, 2, 3};
  577.  
  578.         const int doc_id_2 = 53;
  579.         const string content_2 = "fox dog the city city city"s;
  580.         const vector<int> ratings_2 = {4, 5, 6};
  581.  
  582.         const int doc_id_3 = 54;
  583.         const string content_3 = "dog in the city city city"s;
  584.         const vector<int> ratings_3 = {2, 4, 2};
  585.  
  586.         SearchServer server;
  587.         server.AddDocument(doc_id_1, content_1, DocumentStatus::ACTUAL, ratings_1);
  588.         server.AddDocument(doc_id_2, content_2, DocumentStatus::ACTUAL, ratings_2);
  589.         server.AddDocument(doc_id_3, content_3, DocumentStatus::ACTUAL, ratings_3);
  590.         const auto found_docs = server.FindTopDocuments("cat fox dog"s);
  591.         assert(found_docs.size() == 3);
  592.         assert(found_docs[0].id == doc_id_1);
  593.        // cout << (log(3)/6 + log(3/2)/6 + log(1)/6) << endl;
  594.         assert(abs(found_docs[0].relevance - 0.25068) < 1e-6);
  595.         assert(found_docs[1].id == doc_id_2);
  596.         assert(abs(found_docs[1].relevance - 0.0675775) < 1e-6);
  597.        //assert(abs(found_docs[1].relevance - log(3/2)/6 - log(1)/6) < 1e-6);
  598.         assert(found_docs[2].id == doc_id_3);
  599.         assert(abs(found_docs[2].relevance - 0) < 1e-6);
  600.        //assert(abs(found_docs[2].relevance - log(1)/6) < 1e-6);
  601.     }
  602. }
  603.  
  604.  
  605.  
  606.  
  607. // Функция TestSearchServer является точкой входа для запуска тестов
  608. void TestSearchServer() {
  609.     TestExcludeStopWordsFromAddedDocumentContent();
  610.     TestDocumentsAdding();
  611.     TestStopWordsSupporting();
  612.     TestMinusWordsSupporting();
  613.     TestMatching();
  614.     TestRelevanceSorting();
  615.     TestRating();
  616.     TestLambdaFilter();
  617.     TestStatus();
  618.     TestRelevanceAccuracy();
  619.    
  620.    
  621.     // Не забудьте вызывать остальные тесты здесь
  622. }
  623. /*
  624.  
  625. // --------- Окончание модульных тестов поисковой системы -----------
  626.  
  627. int main() {
  628.     TestSearchServer();
  629.     // Если вы видите эту строку, значит все тесты прошли успешно
  630.     cout << "Search server testing finished"s << endl;
  631. }
  632. */
Advertisement
Add Comment
Please, Sign In to add comment