mirror of
https://github.com/UpsilonNumworks/Upsilon.git
synced 2026-01-18 16:27:34 +01:00
[python] Add matplotlib test WIP
This commit is contained in:
committed by
LeaNumworks
parent
11ac25e935
commit
2f171eb2fd
@@ -189,5 +189,7 @@ $(eval $(call rule_for, \
|
||||
$(call object_for,$(python_src)): $(BUILD_DIR)/python/port/genhdr/qstrdefs.generated.h
|
||||
|
||||
tests_src += $(addprefix python/test/,\
|
||||
execution_environment.cpp \
|
||||
mandelbrot.cpp \
|
||||
matplotlib.cpp \
|
||||
)
|
||||
|
||||
45
python/test/execution_environment.cpp
Normal file
45
python/test/execution_environment.cpp
Normal file
@@ -0,0 +1,45 @@
|
||||
#include "execution_environment.h"
|
||||
#include <quiz.h>
|
||||
#include <assert.h>
|
||||
#include <string.h>
|
||||
|
||||
char TestExecutionEnvironment::s_pythonHeap[TestExecutionEnvironment::s_pythonHeapSize];
|
||||
|
||||
void TestExecutionEnvironment::printText(const char * text, size_t length) {
|
||||
quiz_print(text);
|
||||
}
|
||||
|
||||
// TODO: this will be obsolete when runCode will take a parameter to choose the input type
|
||||
|
||||
void inlineToBeSingleInput(char * buffer, size_t bufferSize, const char * script) {
|
||||
static const char * openExec = "exec(\"";
|
||||
static const char * closeExec = "\")";
|
||||
assert(strlen(script) + strlen(openExec) + strlen(closeExec) < bufferSize);
|
||||
char * bufferChar = buffer;
|
||||
bufferChar += strlcpy(buffer, openExec, bufferSize);
|
||||
const char * scriptChar = script;
|
||||
while (*scriptChar != 0) {
|
||||
assert(bufferChar - buffer + 2 < bufferSize - 1);
|
||||
if (*scriptChar == '\n') {
|
||||
// Turn carriage return in {'\', 'n'} to be processed by exec
|
||||
*bufferChar++ = '\\';
|
||||
*bufferChar++ = 'n';
|
||||
} else {
|
||||
*bufferChar++ = *scriptChar;
|
||||
}
|
||||
scriptChar++;
|
||||
}
|
||||
bufferChar += strlcpy(bufferChar, closeExec, buffer + bufferSize - bufferChar);
|
||||
assert(bufferChar - buffer < bufferSize);
|
||||
*bufferChar = 0;
|
||||
}
|
||||
|
||||
void assert_script_execution_succeeds(const char * script) {
|
||||
constexpr size_t bufferSize = 500;
|
||||
char buffer[bufferSize];
|
||||
inlineToBeSingleInput(buffer, bufferSize, script);
|
||||
MicroPython::init(TestExecutionEnvironment::s_pythonHeap, TestExecutionEnvironment::s_pythonHeap + TestExecutionEnvironment::s_pythonHeapSize);
|
||||
TestExecutionEnvironment env;
|
||||
env.runCode(buffer);
|
||||
MicroPython::deinit();
|
||||
}
|
||||
15
python/test/execution_environment.h
Normal file
15
python/test/execution_environment.h
Normal file
@@ -0,0 +1,15 @@
|
||||
#include <python/port/port.h>
|
||||
#include <apps/code/app.h>
|
||||
|
||||
class TestExecutionEnvironment : public MicroPython::ExecutionEnvironment {
|
||||
public:
|
||||
void printText(const char * text, size_t length) override;
|
||||
static constexpr int s_pythonHeapSize = Code::App::k_pythonHeapSize;
|
||||
static char s_pythonHeap[s_pythonHeapSize];
|
||||
};
|
||||
|
||||
|
||||
// TODO: this will be obsolete when runCode will take a parameter to choose the input type
|
||||
void inlineToBeSingleInput(char * buffer, size_t bufferSize, const char * script);
|
||||
|
||||
void assert_script_execution_succeeds(const char * script);
|
||||
@@ -1,21 +1,5 @@
|
||||
#include <quiz.h>
|
||||
#include <assert.h>
|
||||
#include <string.h>
|
||||
#include <python/port/port.h>
|
||||
#include <apps/code/app.h>
|
||||
|
||||
|
||||
class TestExecutionEnvironment : public MicroPython::ExecutionEnvironment {
|
||||
public:
|
||||
void printText(const char * text, size_t length) override;
|
||||
};
|
||||
|
||||
void TestExecutionEnvironment::printText(const char * text, size_t length) {
|
||||
quiz_print(text);
|
||||
}
|
||||
|
||||
static constexpr int s_pythonHeapSize = Code::App::k_pythonHeapSize;
|
||||
static char s_pythonHeap[s_pythonHeapSize];
|
||||
#include "execution_environment.h"
|
||||
|
||||
static const char * s_mandelbrotScript = R"(#
|
||||
def mandelbrot(N_iteration):
|
||||
@@ -33,37 +17,6 @@ mandelbrot(2)
|
||||
print('ok')
|
||||
)";
|
||||
|
||||
// TODO: this will be obsolete when runCode will take a parameter to choose the input type
|
||||
|
||||
void inlineToBeSingleInput(char * buffer, size_t bufferSize, const char * script) {
|
||||
static const char * openExec = "exec(\"";
|
||||
static const char * closeExec = "\")";
|
||||
assert(strlen(script) + strlen(openExec) + strlen(closeExec) < bufferSize);
|
||||
char * bufferChar = buffer;
|
||||
bufferChar += strlcpy(buffer, openExec, bufferSize);
|
||||
const char * scriptChar = script;
|
||||
while (*scriptChar != 0) {
|
||||
assert(bufferChar - buffer + 2 < bufferSize - 1);
|
||||
if (*scriptChar == '\n') {
|
||||
// Turn carriage return in {'\', 'n'} to be processed by exec
|
||||
*bufferChar++ = '\\';
|
||||
*bufferChar++ = 'n';
|
||||
} else {
|
||||
*bufferChar++ = *scriptChar;
|
||||
}
|
||||
scriptChar++;
|
||||
}
|
||||
bufferChar += strlcpy(bufferChar, closeExec, buffer + bufferSize - bufferChar);
|
||||
assert(bufferChar - buffer < bufferSize);
|
||||
*bufferChar = 0;
|
||||
}
|
||||
|
||||
QUIZ_CASE(python_mandelbrot) {
|
||||
constexpr size_t bufferSize = 500;
|
||||
char buffer[bufferSize];
|
||||
inlineToBeSingleInput(buffer, bufferSize, s_mandelbrotScript);
|
||||
MicroPython::init(s_pythonHeap, s_pythonHeap + s_pythonHeapSize);
|
||||
TestExecutionEnvironment env;
|
||||
env.runCode(buffer);
|
||||
MicroPython::deinit();
|
||||
assert_script_execution_succeeds(s_mandelbrotScript);
|
||||
}
|
||||
|
||||
111
python/test/matplotlib.cpp
Normal file
111
python/test/matplotlib.cpp
Normal file
@@ -0,0 +1,111 @@
|
||||
#include <quiz.h>
|
||||
#include "execution_environment.h"
|
||||
|
||||
static const char * s_pyplotArrowScript = R"(#
|
||||
from matplotlib.pyplot import *
|
||||
arrow(2,3,4,5)
|
||||
show()
|
||||
print('ok')
|
||||
)";
|
||||
|
||||
static const char * s_pyplotAxisScript = R"(#
|
||||
from matplotlib.pyplot import *
|
||||
axis((2,3,4,5))
|
||||
axis([2,3,4,5])
|
||||
print(axis())
|
||||
scatter(0,1)
|
||||
show()
|
||||
print('ok')
|
||||
)";
|
||||
|
||||
static const char * s_pyplotAxisErrorScript = R"(#
|
||||
from matplotlib.pyplot import *
|
||||
axis(2,3,4,5)
|
||||
print('fail!')
|
||||
)";
|
||||
|
||||
static const char * s_pyplotBarScript = R"(#
|
||||
from matplotlib.pyplot import *
|
||||
bar([0,2,3],[10,12,23])
|
||||
bar([0,2,3],10)
|
||||
bar([],[])
|
||||
bar([1,2,3],[1,2,3],2,3)
|
||||
bar([1,2,3],[1,2,3],[1,2,3],[1,2,3])
|
||||
show()
|
||||
print('ok')
|
||||
)";
|
||||
|
||||
static const char * s_pyplotBarErrorScript = R"(#
|
||||
from matplotlib.pyplot import *
|
||||
bar([1,2,3],[1,2,3,4],[1,2,3],[1,2,3])
|
||||
show()
|
||||
print('fail!')
|
||||
)";
|
||||
|
||||
static const char * s_pyplotGridScript = R"(#
|
||||
from matplotlib.pyplot import *
|
||||
grid(True)
|
||||
grid()
|
||||
show()
|
||||
print('ok')
|
||||
)";
|
||||
|
||||
static const char * s_pyplotHistScript = R"(#
|
||||
from matplotlib.pyplot import *
|
||||
hist([2,3,4,5,6])
|
||||
hist([2,3,4,5,6],23)
|
||||
hist([2,3,4,5,6],[0,2,3])
|
||||
hist([2,3,4,5,6],[0,2,3, 4,5,6,7])
|
||||
show()
|
||||
print('ok')
|
||||
)";
|
||||
|
||||
static const char * s_pyplotPlotScript = R"(#
|
||||
from matplotlib.pyplot import *
|
||||
plot([2,3,4,5,6])
|
||||
plot([2,3,4,5,6],[3,4,5,6,7])
|
||||
show()
|
||||
print('ok')
|
||||
)";
|
||||
|
||||
static const char * s_pyplotPlotErrorScript = R"(#
|
||||
from matplotlib.pyplot import *
|
||||
plot([2,3,4,5,6],2)
|
||||
print('Fail!')
|
||||
)";
|
||||
|
||||
static const char * s_pyplotScatterScript = R"(#
|
||||
from matplotlib.pyplot import *
|
||||
scatter(2,3)
|
||||
scatter([2,3,4,5,6],[3,4,5,6,7])
|
||||
show()
|
||||
print('ok')
|
||||
)";
|
||||
|
||||
static const char * s_pyplotScatterErrorScript = R"(#
|
||||
from matplotlib.pyplot import *
|
||||
scatter([2,3,4,5,6],2)
|
||||
print('Fail!')
|
||||
)";
|
||||
|
||||
static const char * s_pyplotTextScript = R"(#
|
||||
from matplotlib.pyplot import *
|
||||
text(2,3, "hello")
|
||||
show()
|
||||
print('ok')
|
||||
)";
|
||||
|
||||
QUIZ_CASE(python_matplotlib_pyplot) {
|
||||
assert_script_execution_succeeds(s_pyplotArrowScript);
|
||||
assert_script_execution_succeeds(s_pyplotAxisScript);
|
||||
assert_script_execution_succeeds(s_pyplotAxisErrorScript);
|
||||
assert_script_execution_succeeds(s_pyplotBarScript);
|
||||
assert_script_execution_succeeds(s_pyplotBarErrorScript);
|
||||
assert_script_execution_succeeds(s_pyplotGridScript);
|
||||
assert_script_execution_succeeds(s_pyplotHistScript);
|
||||
assert_script_execution_succeeds(s_pyplotPlotScript);
|
||||
assert_script_execution_succeeds(s_pyplotPlotErrorScript);
|
||||
assert_script_execution_succeeds(s_pyplotScatterScript);
|
||||
assert_script_execution_succeeds(s_pyplotScatterErrorScript);
|
||||
assert_script_execution_succeeds(s_pyplotTextScript);
|
||||
}
|
||||
Reference in New Issue
Block a user