You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
136 lines
3.5 KiB
C++
136 lines
3.5 KiB
C++
#ifdef TEST_PASS
|
|
test "string_test" {
|
|
|
|
}
|
|
#endif
|
|
|
|
// note: Add a .test file that can be optionally included in the directory which allows a shell command to be executed prior to the test?
|
|
// todo: Finalization pass over tokenizer
|
|
// Tokenizer will go into a parse layer which swaps test "foo" { } to an actual function call
|
|
// int test_foo(test_ctx* Ctx) {}
|
|
// these function calls are put into <orig_name>_generated.cpp
|
|
// after tests are compiled and executed the generated files are deleted
|
|
// maybe have the shell command stuff inside of ctx?
|
|
// todo: Write and research testing framework!
|
|
|
|
#include <direct.h>
|
|
#include <stdio.h>
|
|
#include <stdlib.h>
|
|
|
|
#include <types.h>
|
|
#include <shared.h>
|
|
#include <tokenizer.h>
|
|
|
|
static string msg_prefix = make_string("[Test Suite] ");
|
|
|
|
string ReadEntireFileIntoMemory(char* FileName) {
|
|
string Result = { };
|
|
|
|
FILE* File = fopen(FileName, "r");
|
|
if (File) {
|
|
fseek(File, 0, SEEK_END);
|
|
Result.Count = ftell(File);
|
|
fseek(File, 0, SEEK_SET);
|
|
|
|
Result.Data = (u8*)malloc(Result.Count);
|
|
fread(Result.Data, Result.Count, 1, File);
|
|
|
|
fclose(File);
|
|
}
|
|
|
|
return Result;
|
|
}
|
|
|
|
#include <string.h>
|
|
#include <minwindows.h>
|
|
|
|
struct lexer_state {
|
|
char** FileNames;
|
|
u32 FileNameCount;
|
|
};
|
|
|
|
static lexer_state State;
|
|
|
|
void ListContents(const char* Cwd) {
|
|
char Path[MAX_PATH];
|
|
|
|
_WIN32_FIND_DATAA FindData;
|
|
HANDLE FindHandle = INVALID_HANDLE_VALUE;
|
|
|
|
//Specify a file mask. *.* = We want everything!
|
|
sprintf(Path, "%s\\*.*", Cwd);
|
|
FindHandle = FindFirstFileA(Path, &FindData);
|
|
|
|
do {
|
|
if (strcmp(FindData.cFileName, ".") != 0 && strcmp(FindData.cFileName, "..") != 0) {
|
|
sprintf(Path, "%s\\%s", Cwd, FindData.cFileName);
|
|
|
|
if (FindData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) {
|
|
ListContents(Path);
|
|
}
|
|
else if (Substring(Path, "src") != NULL) {
|
|
State.FileNames[State.FileNameCount] = (char*)malloc(sizeof(char) * MAX_PATH);
|
|
strcpy(State.FileNames[State.FileNameCount], Path);
|
|
++State.FileNameCount;
|
|
}
|
|
}
|
|
} while (FindNextFileA(FindHandle, &FindData));
|
|
}
|
|
|
|
|
|
|
|
int main(char** Args, int ArgCount) {
|
|
TCHAR** lppPart = {NULL}; // For GetFullPath :/
|
|
|
|
char* cwd;
|
|
cwd = _getcwd(NULL, 256);
|
|
|
|
printf("%sTest Suite v0.1\n", msg_prefix.Data);
|
|
printf("%sOperating in directory: %s\n\n", msg_prefix.Data, cwd);
|
|
|
|
// Get the names of the files we will operate on
|
|
State.FileNames = (char**)malloc(2048 * sizeof(char*));
|
|
if (Substring(cwd, "build")) {
|
|
ListContents("..\\tests");
|
|
} else {
|
|
ListContents("tests");
|
|
}
|
|
|
|
for (u32 FileIndex = 0; FileIndex < State.FileNameCount; ++FileIndex) {
|
|
char* Filename = State.FileNames[FileIndex];
|
|
char* FullFilename = (char*)malloc(MAX_PATH * sizeof(char));
|
|
GetFullPathNameA(Filename, MAX_PATH, FullFilename, lppPart);
|
|
printf("%s: \n", FullFilename);
|
|
|
|
string Contents = ReadEntireFileIntoMemory(Filename);
|
|
tokenizer Tokenizer = Tokenize(Contents, Filename);
|
|
|
|
b32 Parsing = true;
|
|
while (Parsing) {
|
|
token Token = GetToken(&Tokenizer);
|
|
switch (Token.Type) {
|
|
case Token_EndOfStream: {
|
|
Parsing = false;
|
|
} break;
|
|
|
|
case Token_Identifier: {
|
|
if (StringsMatch(Token.String, "test")) {
|
|
GetToken(&Tokenizer);
|
|
token Next = GetToken(&Tokenizer);
|
|
|
|
char* TestName = Next.String;
|
|
printf(" test '%s'\n", TestName);
|
|
|
|
}
|
|
} break;
|
|
|
|
case Token_Unknown:
|
|
default: {
|
|
|
|
} break;
|
|
}
|
|
}
|
|
}
|
|
|
|
return 1;
|
|
} |