Skip to content

Commit

Permalink
feat: remaking tests
Browse files Browse the repository at this point in the history
  • Loading branch information
alinalihassan committed Apr 21, 2023
1 parent e3f0aa1 commit 9a66738
Show file tree
Hide file tree
Showing 25 changed files with 123 additions and 60 deletions.
1 change: 1 addition & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -16,4 +16,5 @@ test*.les

# File system specific
**/.DS_Store
**/*.o
.cache/
8 changes: 8 additions & 0 deletions src/liblesma/Backend/Codegen.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -274,11 +274,19 @@ void Codegen::WriteToObjectFile(const std::string &output) {
std::error_code err;
auto out = llvm::raw_fd_ostream(output + ".o", err);

if (err) {
throw CodegenError({}, "Error opening file {} for writing: {}", output, err.message());
}

llvm::legacy::PassManager passManager;
if (TargetMachine->addPassesToEmitFile(passManager, out, nullptr, llvm::CGFT_ObjectFile))
throw CodegenError({}, "Target Machine can't emit an object file");
// Emit object file
passManager.run(*TheModule);

// Flush and close the file
out.flush();
out.close();
}

void Codegen::LinkObjectFile(const std::string &obj_filename) {
Expand Down
4 changes: 1 addition & 3 deletions tests/lesma/failure/enum_compare.les
Original file line number Diff line number Diff line change
@@ -1,5 +1,3 @@
#ret=101
def extern exit(x: int)
enum Color
RED
BLUE
Expand All @@ -11,4 +9,4 @@ enum Color2
GREEN

if Color.RED != Color2.RED
exit(101)
let error = true
4 changes: 2 additions & 2 deletions tests/lesma/success/arithmetic.les
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
#ret=101
def extern exit(x: int)

exit(2 * (10 + 5) + 2 * 10 + 5 + 46)
if 2 * (10 + 5) + 2 * 10 + 5 + 46 != 101
exit(1)
4 changes: 2 additions & 2 deletions tests/lesma/success/assignment.les
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
#ret=101
def extern exit(x: int)
var y: int = 100
y = 101

exit(y)
if y != 101
exit(1)
4 changes: 2 additions & 2 deletions tests/lesma/success/assignop.les
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
#ret=101
def extern exit(x: int)
var y: int = 100
y += 1

exit(y)
if y != 101
exit(1)
4 changes: 2 additions & 2 deletions tests/lesma/success/break.les
Original file line number Diff line number Diff line change
@@ -1,4 +1,3 @@
#ret=101
def extern exit(x: int)
var x: int = 5

Expand All @@ -7,4 +6,5 @@ while true
break
x = x + 1

exit(x)
if x != 101
exit(1)
4 changes: 2 additions & 2 deletions tests/lesma/success/castop.les
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
#ret=101
def extern exit(x: int)
let y: float = 101.5
let z: int = y as int

exit(z)
if z != 101
exit(1)
8 changes: 4 additions & 4 deletions tests/lesma/success/class.les
Original file line number Diff line number Diff line change
@@ -1,4 +1,3 @@
#ret=101
def extern exit(x: int)
export class Animal
var x: int
Expand All @@ -11,7 +10,8 @@ export class Animal

var z = Animal()

def testClass(x: Animal)
exit(x.getX())
def testClass(x: Animal) -> int
return x.getX()

testClass(z)
if testClass(z) != 101
exit(1)
4 changes: 2 additions & 2 deletions tests/lesma/success/continue.les
Original file line number Diff line number Diff line change
@@ -1,4 +1,3 @@
#ret=101
def extern exit(x: int)
var x: int = 5
var y: int = 0
Expand All @@ -9,4 +8,5 @@ while x < 208
continue
y = y + 1

exit(y)
if y != 101
exit(1)
10 changes: 5 additions & 5 deletions tests/lesma/success/enum.les
Original file line number Diff line number Diff line change
@@ -1,4 +1,3 @@
#ret=101
def extern exit(x: int)
enum Color
RED
Expand All @@ -7,10 +6,11 @@ enum Color

var x: Color = Color.RED

def checkEnum(x: Color) -> int
def checkEnum(x: Color) -> bool
if (Color.BLUE == Color.BLUE and Color.GREEN != Color.RED and x == Color.RED)
return 101
return true

return 50
return false

exit(checkEnum(Color.RED))
if not checkEnum(Color.RED)
exit(1)
6 changes: 4 additions & 2 deletions tests/lesma/success/extern_function_call.les
Original file line number Diff line number Diff line change
@@ -1,3 +1,5 @@
#ret=101
def extern exit(x: int)
exit(101)
def extern abs(x: int) -> int

if abs(-1) != 1
exit(1)
4 changes: 2 additions & 2 deletions tests/lesma/success/function_call.les
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
#ret=101
def extern exit(x: int)
export def fib() -> int
return 101

exit(fib())
if fib() != 101
exit(1)
4 changes: 2 additions & 2 deletions tests/lesma/success/function_mangling.les
Original file line number Diff line number Diff line change
@@ -1,9 +1,9 @@
#ret=101
def extern exit(x: int)
def sleep(x: float) -> int
return 50

def sleep(x: int) -> int
return 51

exit(sleep(1.0) + sleep(1))
if sleep(1.0) + sleep(1) != 101
exit(1)
4 changes: 2 additions & 2 deletions tests/lesma/success/ifelse.les
Original file line number Diff line number Diff line change
@@ -1,4 +1,3 @@
#ret=101
def extern exit(x: int)
var x: int = 5
var y: int = 10
Expand All @@ -17,4 +16,5 @@ else if y == 11
else
y = 51

exit(x + y)
if x + y != 101
exit(1)
4 changes: 2 additions & 2 deletions tests/lesma/success/import.les
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
#ret=101
def extern exit(x: int)
import "function_call.les"

exit(function_call.fib())
if function_call.fib() != 101
exit(1)
5 changes: 1 addition & 4 deletions tests/lesma/success/import_alias.les
Original file line number Diff line number Diff line change
@@ -1,5 +1,2 @@
#ret=101
def extern exit(x: int)
import time as timetest
timetest.sleep(0.1)
exit(101)
timetest.sleep(0.1)
4 changes: 2 additions & 2 deletions tests/lesma/success/import_asterisk.les
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
#ret=101
def extern exit(x: int)
from "function_call.les" import *

exit(fib())
if fib() != 101
exit(1)
6 changes: 4 additions & 2 deletions tests/lesma/success/import_std_in_scope.les
Original file line number Diff line number Diff line change
@@ -1,7 +1,9 @@
#ret=101
def extern exit(x: int)
from time import sleep as sleep_test
from "class.les" import Animal

let y = Animal()
sleep_test(0.1)
exit(y.getX())

if y.getX() != 101
exit(1)
4 changes: 2 additions & 2 deletions tests/lesma/success/inference.les
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
#ret=101
def extern exit(x: int)
let x = 101
exit(x)
if x is not int
exit(1)
4 changes: 0 additions & 4 deletions tests/lesma/success/line_continuation.les
Original file line number Diff line number Diff line change
@@ -1,9 +1,5 @@
#ret=101
def extern exit(x: int)
let x = \ # Hello world
100 + \
1

exit(
x
)
1 change: 0 additions & 1 deletion tests/lesma/success/print.les
Original file line number Diff line number Diff line change
@@ -1,2 +1 @@
#ret=0
print("Hello World")
4 changes: 1 addition & 3 deletions tests/lesma/success/var_decl.les
Original file line number Diff line number Diff line change
@@ -1,5 +1,3 @@
#ret=101
def extern exit(x: int)
var x: int = 100
let y: int = 101
exit(y)
let y: int = 101
4 changes: 2 additions & 2 deletions tests/lesma/success/while.les
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
#ret=101
def extern exit(x: int)
var x: int = 0
while x < 101
x = x + 1

exit(x)
if x != 101
exit(1)
74 changes: 68 additions & 6 deletions tests/test.cpp
Original file line number Diff line number Diff line change
@@ -1,15 +1,21 @@
#include <catch2/catch_test_macros.hpp>
#include <catch2/benchmark/catch_benchmark.hpp>
#include <catch2/catch_test_macros.hpp>
#include <fmt/printf.h>

#include "liblesma/Backend/Codegen.h"
#include "liblesma/Common/Utils.h"
#include "liblesma/Driver/Driver.h"
#include "liblesma/Frontend/Lexer.h"
#include "liblesma/Frontend/Parser.h"

#include <filesystem>
#include <fstream>
#include <sstream>
#include <vector>

using namespace lesma;

std::shared_ptr<SourceMgr> initializeSrcMgr(const std::string& source) {
std::shared_ptr<SourceMgr> initializeSrcMgr(const std::string &source) {
// Configure Source Manager
std::shared_ptr<SourceMgr> srcMgr = std::make_shared<SourceMgr>(SourceMgr());

Expand All @@ -19,7 +25,7 @@ std::shared_ptr<SourceMgr> initializeSrcMgr(const std::string& source) {
return srcMgr;
}

Lexer *initializeLexer(const std::shared_ptr<SourceMgr>& srcMgr) {
Lexer *initializeLexer(const std::shared_ptr<SourceMgr> &srcMgr) {
auto lexer = new Lexer(srcMgr);
lexer->ScanAll();

Expand All @@ -42,7 +48,7 @@ Codegen *initializeCodegen(Parser *parser, std::shared_ptr<SourceMgr> srcMgr) {
return codegen;
}

llvm::SMRange getRange(const std::string& source, int x, int y) {
llvm::SMRange getRange(const std::string &source, int x, int y) {
return {llvm::SMLoc::getFromPointer(source.c_str() + x), llvm::SMLoc::getFromPointer(source.c_str() + y)};
}

Expand All @@ -57,7 +63,7 @@ TEST_CASE("Lexer", "Tokens") {

REQUIRE(lexer->getTokens().size() > 1);

std::vector<Token*> tokens = {
std::vector<Token *> tokens = {
new Token{TokenType::VAR, "var", getRange(source, 0, 3)},
new Token{TokenType::IDENTIFIER, "y", getRange(source, 4, 5)},
new Token{TokenType::COLON, ":", getRange(source, 5, 6)},
Expand All @@ -81,7 +87,7 @@ TEST_CASE("Lexer", "Tokens") {
initializeLexer(srcMgr);
};

for (auto [a, b] : zip(tokens, lexer->getTokens()))
for (auto [a, b]: zip(tokens, lexer->getTokens()))
REQUIRE(*a == *b);
}

Expand Down Expand Up @@ -141,4 +147,60 @@ TEST_CASE("Codegen", "Run & Optimize") {
cg->Optimize(OptimizationLevel::O3);
cg->JIT();
};
}

std::string get_directory() {
namespace fs = std::filesystem;
fs::path current_file_path(__FILE__);
fs::path repository_directory = current_file_path.parent_path();
return repository_directory.string();
}

std::vector<std::string> collect_test_files(const std::string &test_folder) {
std::vector<std::string> test_files;
for (const auto &entry: std::filesystem::directory_iterator(test_folder)) {
if (entry.is_regular_file()) {
test_files.push_back(entry.path().string());
}
}
return test_files;
}

TEST_CASE("Lesma Run and Compile", "[lesma]") {
std::string directory = get_directory();
auto success_test_files = collect_test_files(directory + "/lesma/success");
auto failure_test_files = collect_test_files(directory + "/lesma/failure");

for (const auto &test_file: success_test_files) {
SECTION("Testing file: " + test_file) {
auto options = std::make_unique<lesma::Options>(Options{lesma::FILE, test_file});
fmt::print("Test file: {}\n", test_file);

int run_ret_value = lesma::Driver::Run(std::move(options));
print("{}\n", run_ret_value);
REQUIRE(run_ret_value == 0);
fmt::print("File ran\n");

options = std::make_unique<lesma::Options>(Options{lesma::FILE, test_file, NONE, fmt::format("{}/output_{}", directory, test_file)});
int compile_ret_value = lesma::Driver::Compile(std::move(options));
REQUIRE(compile_ret_value == 0);
fmt::print("File compiled\n");
}
}

for (const auto &test_file: failure_test_files) {
SECTION("Testing file: " + test_file) {
auto options = std::make_unique<lesma::Options>(Options{lesma::FILE, test_file});
fmt::print("Test file: {}\n", test_file);

int run_ret_value = lesma::Driver::Run(std::move(options));
REQUIRE(run_ret_value != 0);
fmt::print("File ran\n");

options = std::make_unique<lesma::Options>(Options{lesma::FILE, test_file, NONE, fmt::format("{}/output_{}", directory, test_file)});
int compile_ret_value = lesma::Driver::Compile(std::move(options));
REQUIRE(compile_ret_value != 0);
fmt::print("File compiled\n");
}
}
}

0 comments on commit 9a66738

Please sign in to comment.