Description
Que se passe-t-il avec les exemples "vicieux" décrits dans Tests.md ?
Tests
Je donne ci-dessous des exemples d'entrées sorties, pour tester le système, dans différents langages.
Je veux montrer à chaque fois des exemples :
- numériques (pour montrer que l'on peut s'en servir comme d'une petite calculatrice) ;
- montrant un élément de syntaxe spécifique au langage (
dict
/set
/list
/tuple
en compréhension en Python,type
/match with
/let rec
en OCaml,fonction
/pointeur
en C) ; - montrer que l'on peut importer un module ou une bibliothèque.
Bonus :
- montrer que le système gère bien les stderr et les exceptions ?
- TODO: montrer que l'on peut afficher proprement le code de retour 0 / 1 / autre ?
- montrer que le système exécute bien le code en isolement de la machine : pas capable de lire (ou écrire) quoique ce soit, de supprimer un fichier, et d'utiliser Internet.
Lancer ou automatiser ces tests ?
Les tests sont définis dans le dossier json_tests.
Ces tests sont automatisés avec le super Makefile intégré :
$ make test_python
$ make test_ocaml
$ make test_c
TODO: automatically build the fileNUM.ext
and fileNUM.json
from this file?
En Python
Les tests sont définis dans le dossier json_tests.
- numériques (pour montrer que l'on peut s'en servir comme d'une petite calculatrice) ;
In[1]: print(0.1+0.1+0.1)
Out[1]: 0.30000000000000004
- montrant un élément de syntaxe spécifique au langage (
dict
/set
/list
/tuple
en compréhension en Python,type
/match with
/let rec
en OCaml,fonction
/pointeur
en C) ;
In[2]: sum(max(i**k-j**(k+1) for i in range(2**k) for j in range(3**k)) for k in [3,4,5,6,7,8])
Out[2]: 17878636286225238456
- montrer que l'on peut importer un module ou une bibliothèque :
In[3]: import math; print(math.exp(math.pi)**3 + math.cos(math.sin(1)))
Out[3]: 12392.314174662086
In[4]: import os; print(f"os.getcwd()={os.getcwd()}")
Out[4]: os.getcwd()=/home/lilian/publis/Peut-on-coder-avec-OCaml-Python-and-C-par-SMS.git
- montrer que le système gère bien les stderr et les exceptions ?
In[5]: print(f"2021/0 = {2021/0}")
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
ZeroDivisionError: division by zero
In[6]: print("This is fine."); assert(0.1+0.1+0.1 == 0.3)
This is fine.
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
AssertionError
- montrer que le système exécute bien le code en isolement de la machine : pas capable de lire (ou écrire) quoique ce soit, de supprimer un fichier, et d'utiliser Internet.
In[7]: file=open("/etc/passwd", "r"); print("".join(file.readlines()))
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
FileNotFoundError: [Errno 2] No such file or directory: '/etc/passwd'
In[8]: path="test.txt"; file=open(path, "w"); print("Test to write to a file from Python: succeed, now file is gone", file=file, flush=True); file=open(path, "r"); print("".join(file.readlines())); import os; os.remove(path)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
FileNotFoundError: [Errno 2] No such file or directory: 'test.txt'
In[9]: import re; from urllib.request import urlopen; html="".join(l.decode() for l in urlopen("http://monip.org/").readlines()); ip=re.search("[0-9]+.[0-9]+.[0-9]+.[0-9]+", html).group(0); print(f"Your IP address is: {ip}")
Out[9]: 1.2.3.4
En OCaml
Les tests sont définis dans le dossier json_tests.
TODO: WARNING: camisole uses ocamlopt
and not ocaml
toplevel!
- numériques (pour montrer que l'on peut s'en servir comme d'une petite calculatrice) ;
# print_endline (string_of_bool ((0.1 +. 0.1 +. 0.1) = 0.3));;
false
- : unit = ()
- montrant un élément de syntaxe spécifique au langage (
dict
/set
/list
/tuple
en compréhension en Python,type
/match with
/let rec
en OCaml,fonction
/pointeur
en C) ;
# type 'a btree = Leaf of 'a | Node of ('a btree * 'a btree);; let rec sum (tree : int btree) = match tree with | Leaf i -> i | Node(left, right) -> (sum left) + (sum right);; sum( Node(Leaf 10, Node(Leaf 20, Leaf 30)) );;
- : int = 60
# let rec fibo n = match n with | 0 -> 0 | 1 -> 1 | n -> (fibo (n-1)) + (fibo (n-2)) in fibo 30;;
- : int = 832040
- montrer que l'on peut importer un module ou une bibliothèque :
# let range n = Array.init n (fun i -> i) in List.fold_left (+) 0 (Array.to_list (range 100));;
- : int = 4950
- montrer que le système gère bien les stderr et les exceptions ?
# 1 / 0;;
Exception: Division_by_zero.
# print_endline "This is fine."; 1 / 0;;
This is fine.
Exception: Division_by_zero.
- montrer que le système exécute bien le code en isolement de la machine : pas capable de lire (ou écrire) quoique ce soit, de supprimer un fichier, et d'utiliser Internet.
# Sys.command("cat /etc/passwd");;
cat: /etc/passwd: No such file or directory
- : int = 1
TODO: convert these code to not use Sys.command
but pure OCaml API.
# Sys.command("echo 'Test to write to a file from OCaml: succeed, now file is gone' > test.txt ; cat test.txt ; rm -vf test.txt");;
Test to write to a file from OCaml: succeed, now file is gone
removed 'test.txt'
- : int = 0
# Sys.command("wget --quiet http://monip.org/ -O - | html2text | grep -o 'IP : .*'")
IP : 1.2.3.4
- : int = 0
En C
Les tests sont définis dans le dossier json_tests.
TODO:
Et autres ?
Comme ce système utilise Camisole, je pourrais tester tous les langages supportés :
Ada, C, C#, C++, D, Go, Haskell, Java, Javascript, Lua, OCaml, PHP, Pascal, Perl, Prolog, Python, Ruby, Rust, Scheme.
Sur ma machine, je pourrai tester Lua, Java, Javascript et Rust.