//: C03:Find.h
// Z knihy "Myslíme v jazyce C++, část 2" od Bruce Eckela a Chucka Allisona.
// (c) 1995-2004 MindView, Inc. Všechna práva vyhrazena.
// Přečtěte si podmínky používání zdrojových kódů umístěné v souboru 
// 'Licence.txt' dodávaném spolu s balíčkem kódu dostupným na www.MindView.net.
#ifndef FIND_H
#define FIND_H
#include <cctype>
#include <cstddef>
#include <string>
#include "../TestSuite/Test.h"
using std::size_t;
using std::string;
using std::tolower;
using std::toupper;

// Vytvořit kopii s převedenou na velká pásmena
inline string velkaPismena(const string& s) {
  string velka(s);
  for(size_t i = 0; i < s.length(); ++i)
    velka[i] = toupper(velka[i]);
  return velka;
}

// Vytvořit kopii s převedenou na malá pásmena
inline string malaPismena(const string& s) {
  string mala(s);
  for(size_t i = 0; i < s.length(); ++i)
    mala[i] = tolower(mala[i]);
  return mala;
}

class FindTest : public TestSuite::Test {
  string vyberJedno;
public:
  FindTest() : vyberJedno("Eniky, Beniky, Kliky, Be") {}
  void testVelkych() {
    string velka = velkaPismena(vyberJedno);
    const string MALA = "abcdefghijklmnopqrstuvwxyz";
    test_(velka.find_first_of(MALA) == string::npos);
  }
  void testMalych() {
    string mala = malaPismena(vyberJedno);
    const string VELKA = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
    test_(mala.find_first_of(VELKA) == string::npos);
  }
  void testHledani() {
    // hledání rozlišující velikost znaků
    size_t i = vyberJedno.find("eni");
    test_(i == 8);
    // hledáná malých písmen:
    string test = malaPismena(vyberJedno);
    i = test.find("eni");
    test_(i == 0);
    i = test.find("eni", ++i);
    test_(i == 8);
    i = test.find("eni", ++i);
    test_(i == string::npos);
    // hledáná velkých písmen:
    test = velkaPismena(vyberJedno);
    i = test.find("ENI");
    test_(i == 0);
    i = test.find("ENI", ++i);
    test_(i == 8);
    i = test.find("ENI", ++i);
    test_(i == string::npos);
  }
  void run() {
    testVelkych();
    testMalych();
    testHledani();
  }
};
#endif // FIND_H ///:~
