Skip to content

Que se passe-t-il avec les exemples "vicieux" décrits dans Tests.md ? #6

Open
@Naereen

Description

@Naereen

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.

Metadata

Metadata

Assignees

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions