/*************************************************************************
> File Name: test.h
> Author: wangzhicheng
> Mail: [email protected]
> Created Time: Fri 11 Aug 2017 09:30:45 PM AWST
************************************************************************/
#ifndef TEST_H
#define TEST_H
#include <stdio.h>
#include <string.h>
#include <iostream>
#include <vector>
using namespace std;
void GetUrlKeyVal(const char *uri, vector<string>&keys, vector<string>&values);
#endif
/*************************************************************************
> File Name: test.cpp
> Author: wangzhicheng
> Mail: [email protected]
> Created Time: Wed 02 Aug 2017 10:49:18 PM AWST
************************************************************************/
#include "test.h"
void GetUrlKeyVal(const char *uri, vector<string>&keys, vector<string>&values)
{
const char *p = uri;
while(*p)
{
if('?' == *p) break;
p++;
}
if(0 == *p) return;
char tmp[1024] = "";
int loop = 0;
bool Get = false;
while(*p)
{
if(*(p + 1) && !Get)
{
sscanf(p + 1, "%[^= | &]", tmp);
if(strcmp(tmp, ""))
{
Get = true;
if(!loop) keys.emplace_back(tmp);
else values.emplace_back(tmp);
}
}
p++;
if(0 == *p) break;
if(('=' == *p) || ('&' == *p))
{
if('=' == *p) loop = 1;
else loop = 0;
Get = false;
}
}
}
/*************************************************************************
> File Name: test_unittest.cpp
> Author: wangzhicheng
> Mail: [email protected]
> Created Time: Fri 11 Aug 2017 09:33:22 PM AWST
************************************************************************/
#include "test.h"
#include "gtest/gtest.h"
TEST(GETURLKEYVAL, NORMAL)
{
const char *uri = "http://www.123.com/jk/lll?key0=val0&key1=val1&key2=val2&keyXX0=val_0090*";
vector<string>keys;
vector<string>values;
GetUrlKeyVal(uri, keys, values);
EXPECT_EQ("key0", keys[0]);
EXPECT_EQ("key1", keys[1]);
EXPECT_EQ("key2", keys[2]);
EXPECT_EQ("keyXX0", keys[3]);
EXPECT_EQ("val0", values[0]);
EXPECT_EQ("val1", values[1]);
EXPECT_EQ("val2", values[2]);
EXPECT_EQ("val_0090*", values[3]);
}
TEST(GETURLKEYVAL, ABNORMAL0)
{
const char *uri = "http://www.123.com/jk/lll?";
vector<string>keys;
vector<string>values;
GetUrlKeyVal(uri, keys, values);
EXPECT_EQ(0, keys.size());
EXPECT_EQ(0, values.size());
}
TEST(GETURLKEYVAL, ABNORMAL1)
{
const char *uri = "http://www.123.com/jk/lll?&";
vector<string>keys;
vector<string>values;
GetUrlKeyVal(uri, keys, values);
EXPECT_EQ(0, keys.size());
EXPECT_EQ(0, values.size());
}
TEST(GETURLKEYVAL, ABNORMAL2)
{
const char *uri = "http://www.123.com/jk/lll?kkkk&";
vector<string>keys;
vector<string>values;
GetUrlKeyVal(uri, keys, values);
EXPECT_EQ("kkkk", keys[0]);
EXPECT_EQ(0, values.size());
}
TEST(GETURLKEYVAL, ABNORMAL3)
{
const char *uri = "http://www.123.com/jk/lll?kkkk&key1=val1&";
vector<string>keys;
vector<string>values;
GetUrlKeyVal(uri, keys, values);
EXPECT_EQ("kkkk", keys[0]);
EXPECT_EQ("key1", keys[1]);
EXPECT_EQ("val1", values[0]);
}
TEST(GETURLKEYVAL, ABNORMAL4)
{
const char *uri = "http://www.123.com/jk/lll?=kkkk&key1=val1&";
vector<string>keys;
vector<string>values;
GetUrlKeyVal(uri, keys, values);
EXPECT_EQ("key1", keys[0]);
EXPECT_EQ("kkkk", values[0]);
EXPECT_EQ("val1", values[1]);
}
# A sample Makefile for building Google Test and using it in user
# tests. Please tweak it to suit your environment and project. You
# may want to move it to your project's root directory.
#
# SYNOPSIS:
#
# make [all] - makes everything.
# make TARGET - makes the given target.
# make clean - removes all files generated by make.
# Please tweak the following variable definitions as needed by your
# project, except GTEST_HEADERS, which you can use in your own targets
# but shouldn't modify.
# Points to the root of Google Test, relative to where this file is.
# Remember to tweak this if you move this file.
GTEST_DIR = /home/wangzhicheng/C++/gtest/googletest-master/googletest/
# Where to find user code.
USER_DIR = ./
# Flags passed to the preprocessor.
# Set Google Test's header directory as a system directory, such that
# the compiler doesn't generate warnings in Google Test headers.
CPPFLAGS += -isystem $(GTEST_DIR)/include
# Flags passed to the C++ compiler.
CXXFLAGS += -std=c++11 -g -Wall -Wextra -pthread
# All tests produced by this Makefile. Remember to add new tests you
# created to the list.
TESTS = test_unittest
# All Google Test headers. Usually you shouldn't change this
# definition.
GTEST_HEADERS = $(GTEST_DIR)/include/gtest/*.h \
$(GTEST_DIR)/include/gtest/internal/*.h
# House-keeping build targets.
all : $(TESTS)
clean :
rm -f $(TESTS) gtest.a gtest_main.a *.o
# Builds gtest.a and gtest_main.a.
# Usually you shouldn't tweak such internal variables, indicated by a
# trailing _.
GTEST_SRCS_ = $(GTEST_DIR)/src/*.cc $(GTEST_DIR)/src/*.h $(GTEST_HEADERS)
# For simplicity and to avoid depending on Google Test's
# implementation details, the dependencies specified below are
# conservative and not optimized. This is fine as Google Test
# compiles fast and for ordinary users its source rarely changes.
gtest-all.o : $(GTEST_SRCS_)
$(CXX) $(CPPFLAGS) -I$(GTEST_DIR) $(CXXFLAGS) -c \
$(GTEST_DIR)/src/gtest-all.cc
gtest_main.o : $(GTEST_SRCS_)
$(CXX) $(CPPFLAGS) -I$(GTEST_DIR) $(CXXFLAGS) -c \
$(GTEST_DIR)/src/gtest_main.cc
gtest.a : gtest-all.o
$(AR) $(ARFLAGS) $@ $^
gtest_main.a : gtest-all.o gtest_main.o
$(AR) $(ARFLAGS) $@ $^
# Builds a sample test. A test should link with either gtest.a or
# gtest_main.a, depending on whether it defines its own main()
# function.
test.o : $(USER_DIR)/test.cpp $(USER_DIR)/test.h $(GTEST_HEADERS)
$(CXX) $(CPPFLAGS) $(CXXFLAGS) -c $(USER_DIR)/test.cpp
test_unittest.o : $(USER_DIR)/test_unittest.cpp \
$(USER_DIR)/test.h $(GTEST_HEADERS)
$(CXX) $(CPPFLAGS) $(CXXFLAGS) -c $(USER_DIR)/test_unittest.cpp
test_unittest : test.o test_unittest.o gtest_main.a
$(CXX) $(CPPFLAGS) $(CXXFLAGS) -lpthread $^ -o $@