Parcourir la source

Merge branch 'dev'

Leo il y a 10 ans
Parent
commit
0153d992d1
17 fichiers modifiés avec 530 ajouts et 26 suppressions
  1. 2 0
      .gitignore
  2. 3 2
      CHANGELOG.md
  3. 4 2
      INSTALL.md
  4. 1 1
      VERSION
  5. 15 1
      _oasis
  6. 16 1
      _tags
  7. 2 0
      bench/Makefile
  8. 61 0
      bench/sprintf_vs_concat.ml
  9. 8 3
      myocamlbuild.ml
  10. 23 0
      opam
  11. 3 1
      setup.data
  12. 250 8
      setup.ml
  13. 24 6
      src/edit_command.ml
  14. 1 1
      src/oclaunch.ml
  15. 3 0
      src/test/.merlin
  16. 70 0
      src/test/ec_t.ml
  17. 44 0
      src/test/test.ml

+ 2 - 0
.gitignore

@@ -6,6 +6,8 @@ _build
 setup.data
 setup.log
 setup.exe
+# Tests
+_tests
 # # pkg.sh
 dist
 # Misc

+ 3 - 2
CHANGELOG.md

@@ -3,10 +3,11 @@
 ## 0.2.x
 
 ### v0.2.2
+ + Add unit tests, to improve stability
  + Clean help
+ + Better display after editing an entry. Ignore empty lines and fix #10
  + Use lazyness to speed up and lead to less error
- + Locking tmp file to prevent launching two times the same item (**not tested
-   enough**)
+ + Locking tmp file to prevent launching two times the same item
  + Messages displayed with bold, underline and colors.
  + Add options:
     + “-v” to set verbosity.

+ 4 - 2
INSTALL.md

@@ -1,5 +1,5 @@
 <!--- OASIS_START --->
-<!--- DO NOT EDIT (digest: 9e32abada3d7ab0ee6974517a830cab5) --->
+<!--- DO NOT EDIT (digest: 641d2e4362cb9e2f3469b89eff9de495) --->
 
 This is the INSTALL file for the OcLaunch distribution.
 
@@ -11,11 +11,13 @@ Dependencies
 
 In order to compile this package, you will need:
 
-* ocaml
+* ocaml for all, test tests
 * findlib
 * core
 * core_extended
 * atdgen
+* alcotest for executable run_test
+* oUnit for executable run_test
 
 Installing
 ==========

+ 1 - 1
VERSION

@@ -1 +1 @@
-0.2.2-dev
+

+ 15 - 1
_oasis

@@ -1,6 +1,6 @@
 OASISFormat: 0.4
 Name:        OcLaunch
-Version:     0.2.2-dev
+Version:     
 Synopsis:    Launch commands automagically
 Authors:     Joly Clément <leowzukw@vmail.me>
 Maintainers: Joly Clément <leowzukw@vmail.me>
@@ -30,3 +30,17 @@ Executable oclaunch
   MainIs:     oclaunch.ml
   BuildDepends: core, core_extended, atdgen, threads
   CompiledObject: best
+
+Executable "run_test"
+  Path: src
+  MainIs: test/test.ml
+  Build$: flag(tests)
+  CompiledObject: best
+  Install: false
+  BuildDepends: alcotest, oUnit, core, threads, core_extended, atdgen
+
+Test "tests"
+  Run$: flag(tests)
+  Command: $run_test
+  WorkingDirectory: src/test
+

+ 16 - 1
_tags

@@ -1,5 +1,5 @@
 # OASIS_START
-# DO NOT EDIT (digest: 02210ef353a898c316823ab4516d6163)
+# DO NOT EDIT (digest: d2586eecbf711619953a777ca84195da)
 # Ignore VCS directories, you can use the same kind of rule outside
 # OASIS_START/STOP if you want to exclude directories that contains
 # useless stuff for the build process
@@ -19,8 +19,23 @@ true: annot, bin_annot
 <src/oclaunch.{native,byte}>: pkg_core
 <src/oclaunch.{native,byte}>: pkg_core_extended
 <src/oclaunch.{native,byte}>: pkg_threads
+# Executable run_test
+<src/test/test.{native,byte}>: pkg_alcotest
+<src/test/test.{native,byte}>: pkg_atdgen
+<src/test/test.{native,byte}>: pkg_core
+<src/test/test.{native,byte}>: pkg_core_extended
+<src/test/test.{native,byte}>: pkg_oUnit
+<src/test/test.{native,byte}>: pkg_threads
+<src/*.ml{,i,y}>: pkg_alcotest
 <src/*.ml{,i,y}>: pkg_atdgen
 <src/*.ml{,i,y}>: pkg_core
 <src/*.ml{,i,y}>: pkg_core_extended
+<src/*.ml{,i,y}>: pkg_oUnit
 <src/*.ml{,i,y}>: pkg_threads
+<src/test/*.ml{,i,y}>: pkg_alcotest
+<src/test/*.ml{,i,y}>: pkg_atdgen
+<src/test/*.ml{,i,y}>: pkg_core
+<src/test/*.ml{,i,y}>: pkg_core_extended
+<src/test/*.ml{,i,y}>: pkg_oUnit
+<src/test/*.ml{,i,y}>: pkg_threads
 # OASIS_STOP

+ 2 - 0
bench/Makefile

@@ -0,0 +1,2 @@
+all:
+	corebuild -pkg core_bench sprintf_vs_concat.byte

+ 61 - 0
bench/sprintf_vs_concat.ml

@@ -0,0 +1,61 @@
+(******************************************************************************)
+(* Copyright © Joly Clément, 2015                                        *)
+(*                                                                            *)
+(*  leowzukw@vmail.me                                                         *)
+(*                                                                            *)
+(*  Ce logiciel est un programme informatique servant à exécuter              *)
+(*  automatiquement des programmes à l'ouverture du terminal.                 *)
+(*                                                                            *)
+(*  Ce logiciel est régi par la licence CeCILL soumise au droit français et   *)
+(*  respectant les principes de diffusion des logiciels libres. Vous pouvez   *)
+(*  utiliser, modifier et/ou redistribuer ce programme sous les conditions    *)
+(*  de la licence CeCILL telle que diffusée par le CEA, le CNRS et l'INRIA    *)
+(*  sur le site "http://www.cecill.info".                                     *)
+(*                                                                            *)
+(*  En contrepartie de l'accessibilité au code source et des droits de copie, *)
+(*  de modification et de redistribution accordés par cette licence, il n'est *)
+(*  offert aux utilisateurs qu'une garantie limitée.  Pour les mêmes raisons, *)
+(*  seule une responsabilité restreinte pèse sur l'auteur du programme,  le   *)
+(*  titulaire des droits patrimoniaux et les concédants successifs.           *)
+(*                                                                            *)
+(*  A cet égard  l'attention de l'utilisateur est attirée sur les risques     *)
+(*  associés au chargement,  à l'utilisation,  à la modification et/ou au     *)
+(*  développement et à la reproduction du logiciel par l'utilisateur étant    *)
+(*  donné sa spécificité de logiciel libre, qui peut le rendre complexe à     *)
+(*  manipuler et qui le réserve donc à des développeurs et des professionnels *)
+(*  avertis possédant  des  connaissances  informatiques approfondies.  Les   *)
+(*  utilisateurs sont donc invités à charger  et  tester  l'adéquation  du    *)
+(*  logiciel à leurs besoins dans des conditions permettant d'assurer la      *)
+(*  sécurité de leurs systèmes et ou de leurs données et, plus généralement,  *)
+(*  à l'utiliser et l'exploiter dans les mêmes conditions de sécurité.        *)
+(*                                                                            *)
+(*  Le fait que vous puissiez accéder à cet en-tête signifie que vous avez    *)
+(*  pris connaissance de la licence CeCILL, et que vous en avez accepté les   *)
+(*  termes.                                                                   *)
+(******************************************************************************)
+
+open Core.Std;;
+
+(* File to test who is the faster fo a special case *)
+open Core_bench.Std
+
+let str = "qwertyuiop"
+
+(* With sprintf *)
+let sprtf () =
+    sprintf "\n%s\n" str
+    |> ignore
+
+let conc () =
+    String.concat [ "\n" ; str ; "\n" ]
+    |> ignore
+
+let tests = [
+  "Sprintf", sprtf;
+  "String.concat", conc;
+]
+
+let () =
+  List.map tests ~f:(fun (name,test) -> Bench.Test.create ~name test)
+  |> Bench.make_command
+  |> Command.run

+ 8 - 3
myocamlbuild.ml

@@ -1,5 +1,5 @@
 (* OASIS_START *)
-(* DO NOT EDIT (digest: 2b686a81cec9fb16d1640bda36a68fbd) *)
+(* DO NOT EDIT (digest: 2948e791e5da69ac0f577932ef77419e) *)
 module OASISGettext = struct
 (* # 22 "src/oasis/OASISGettext.ml" *)
 
@@ -606,13 +606,18 @@ end
 # 606 "myocamlbuild.ml"
 open Ocamlbuild_plugin;;
 let package_default =
-  {MyOCamlbuildBase.lib_ocaml = []; lib_c = []; flags = []; includes = []}
+  {
+     MyOCamlbuildBase.lib_ocaml = [];
+     lib_c = [];
+     flags = [];
+     includes = [("src/test", ["src"]); ("src", ["src/test"])]
+  }
   ;;
 
 let conf = {MyOCamlbuildFindlib.no_automatic_syntax = false}
 
 let dispatch_default = MyOCamlbuildBase.dispatch_default conf package_default;;
 
-# 617 "myocamlbuild.ml"
+# 622 "myocamlbuild.ml"
 (* OASIS_STOP *)
 Ocamlbuild_plugin.dispatch dispatch_default;;

+ 23 - 0
opam

@@ -0,0 +1,23 @@
+opam-version: "1.2"
+name: "oclaunch"
+version: "git-dev"
+maintainer: "Leo <leowzukw@vmail.me>"
+authors: "Leo <leowzukw@vmail.me>"
+license: "CeCILL"
+homepage: "http://www.oclaunch.tuxfamily.org"
+bug-reports: "https://gitlab.com/WzukW/oclaunch/issues/new"
+dev-repo: "git@gitlab.com:WzukW/oclaunch.git"
+build: [
+  ["./configure" "--prefix=%{prefix}%"]
+  [make]
+]
+available: [ ocaml-version >= "4.01.0"]
+install: [make "install"]
+remove: ["ocamlfind" "remove" "ocl"]
+depends: [
+  "atdgen"
+  "base-threads"
+  "core"
+  "core_extended"
+  "ocamlfind" {build}
+]

+ 3 - 1
setup.data

@@ -50,12 +50,14 @@ profile="false"
 native_dynlink="true"
 ocamlbuildflags=""
 docs="false"
-tests="false"
+tests="true"
 camlp4o="/home/lwzukw/.opam/4.01.0/bin/camlp4o"
 pkg_core="/home/lwzukw/.opam/4.01.0/lib/core"
 pkg_core_extended="/home/lwzukw/.opam/4.01.0/lib/core_extended"
 pkg_atdgen="/home/lwzukw/.opam/4.01.0/lib/atdgen"
 pkg_threads="/home/lwzukw/.opam/4.01.0/lib/ocaml"
+pkg_alcotest="/home/lwzukw/.opam/4.01.0/lib/alcotest"
+pkg_ounit="/home/lwzukw/.opam/4.01.0/lib/oUnit"
 pkg_biniou="/home/lwzukw/.opam/4.01.0/lib/biniou"
 pkg_config_file="/home/lwzukw/.opam/4.01.0/lib/config-file"
 pkg_yojson="/home/lwzukw/.opam/4.01.0/lib/yojson"

+ 250 - 8
setup.ml

@@ -1,7 +1,7 @@
 (* setup.ml generated for the first time by OASIS v0.4.5 *)
 
 (* OASIS_START *)
-(* DO NOT EDIT (digest: 222f72aedda36c0f8007ed5c735d6e4b) *)
+(* DO NOT EDIT (digest: e85537f969feafc7b8eee94a9fce28c0) *)
 (*
    Regenerated by OASIS v0.4.5
    Visit http://oasis.forge.ocamlcore.org for more information and
@@ -6649,21 +6649,199 @@ end
 
 
 # 6651 "setup.ml"
+module CustomPlugin = struct
+(* # 22 "src/plugins/custom/CustomPlugin.ml" *)
+
+
+  (** Generate custom configure/build/doc/test/install system
+      @author
+    *)
+
+
+  open BaseEnv
+  open OASISGettext
+  open OASISTypes
+
+
+
+
+
+  type t =
+      {
+        cmd_main:      command_line conditional;
+        cmd_clean:     (command_line option) conditional;
+        cmd_distclean: (command_line option) conditional;
+      }
+
+
+  let run  = BaseCustom.run
+
+
+  let main t _ extra_args =
+    let cmd, args =
+      var_choose
+        ~name:(s_ "main command")
+        t.cmd_main
+    in
+      run cmd args extra_args
+
+
+  let clean t pkg extra_args =
+    match var_choose t.cmd_clean with
+      | Some (cmd, args) ->
+          run cmd args extra_args
+      | _ ->
+          ()
+
+
+  let distclean t pkg extra_args =
+    match var_choose t.cmd_distclean with
+      | Some (cmd, args) ->
+          run cmd args extra_args
+      | _ ->
+          ()
+
+
+  module Build =
+  struct
+    let main t pkg extra_args =
+      main t pkg extra_args;
+      List.iter
+        (fun sct ->
+           let evs =
+             match sct with
+               | Library (cs, bs, lib) when var_choose bs.bs_build ->
+                   begin
+                     let evs, _ =
+                       BaseBuilt.of_library
+                         OASISHostPath.of_unix
+                         (cs, bs, lib)
+                     in
+                       evs
+                   end
+               | Executable (cs, bs, exec) when var_choose bs.bs_build ->
+                   begin
+                     let evs, _, _ =
+                       BaseBuilt.of_executable
+                         OASISHostPath.of_unix
+                         (cs, bs, exec)
+                     in
+                       evs
+                   end
+               | _ ->
+                   []
+           in
+             List.iter
+               (fun (bt, bnm, lst) -> BaseBuilt.register bt bnm lst)
+               evs)
+        pkg.sections
+
+    let clean t pkg extra_args =
+      clean t pkg extra_args;
+      (* TODO: this seems to be pretty generic (at least wrt to ocamlbuild
+       * considering moving this to BaseSetup?
+       *)
+      List.iter
+        (function
+           | Library (cs, _, _) ->
+               BaseBuilt.unregister BaseBuilt.BLib cs.cs_name
+           | Executable (cs, _, _) ->
+               BaseBuilt.unregister BaseBuilt.BExec cs.cs_name;
+               BaseBuilt.unregister BaseBuilt.BExecLib cs.cs_name
+           | _ ->
+               ())
+        pkg.sections
+
+    let distclean t pkg extra_args =
+      distclean t pkg extra_args
+  end
+
+
+  module Test =
+  struct
+    let main t pkg (cs, test) extra_args =
+      try
+        main t pkg extra_args;
+        0.0
+      with Failure s ->
+        BaseMessage.warning
+          (f_ "Test '%s' fails: %s")
+          cs.cs_name
+          s;
+        1.0
+
+    let clean t pkg (cs, test) extra_args =
+      clean t pkg extra_args
+
+    let distclean t pkg (cs, test) extra_args =
+      distclean t pkg extra_args
+  end
+
+
+  module Doc =
+  struct
+    let main t pkg (cs, _) extra_args =
+      main t pkg extra_args;
+      BaseBuilt.register BaseBuilt.BDoc cs.cs_name []
+
+    let clean t pkg (cs, _) extra_args =
+      clean t pkg extra_args;
+      BaseBuilt.unregister BaseBuilt.BDoc cs.cs_name
+
+    let distclean t pkg (cs, _) extra_args =
+      distclean t pkg extra_args
+  end
+
+
+end
+
+
+# 6799 "setup.ml"
 open OASISTypes;;
 
 let setup_t =
   {
      BaseSetup.configure = InternalConfigurePlugin.configure;
      build = OCamlbuildPlugin.build [];
-     test = [];
+     test =
+       [
+          ("tests",
+            CustomPlugin.Test.main
+              {
+                 CustomPlugin.cmd_main =
+                   [(OASISExpr.EBool true, ("$run_test", []))];
+                 cmd_clean = [(OASISExpr.EBool true, None)];
+                 cmd_distclean = [(OASISExpr.EBool true, None)]
+              })
+       ];
      doc = [];
      install = InternalInstallPlugin.install;
      uninstall = InternalInstallPlugin.uninstall;
      clean = [OCamlbuildPlugin.clean];
-     clean_test = [];
+     clean_test =
+       [
+          ("tests",
+            CustomPlugin.Test.clean
+              {
+                 CustomPlugin.cmd_main =
+                   [(OASISExpr.EBool true, ("$run_test", []))];
+                 cmd_clean = [(OASISExpr.EBool true, None)];
+                 cmd_distclean = [(OASISExpr.EBool true, None)]
+              })
+       ];
      clean_doc = [];
      distclean = [];
-     distclean_test = [];
+     distclean_test =
+       [
+          ("tests",
+            CustomPlugin.Test.distclean
+              {
+                 CustomPlugin.cmd_main =
+                   [(OASISExpr.EBool true, ("$run_test", []))];
+                 cmd_clean = [(OASISExpr.EBool true, None)];
+                 cmd_distclean = [(OASISExpr.EBool true, None)]
+              })
+       ];
      distclean_doc = [];
      package =
        {
@@ -6673,7 +6851,7 @@ let setup_t =
           alpha_features = ["stdfiles_markdown"; "compiled_setup_ml"];
           beta_features = [];
           name = "OcLaunch";
-          version = "0.2.2-dev";
+          version = "";
           license =
             OASISLicense.DEP5License
               (OASISLicense.DEP5Unit
@@ -6764,7 +6942,71 @@ let setup_t =
                       bs_byteopt = [(OASISExpr.EBool true, [])];
                       bs_nativeopt = [(OASISExpr.EBool true, [])]
                    },
-                   {exec_custom = false; exec_main_is = "oclaunch.ml"})
+                   {exec_custom = false; exec_main_is = "oclaunch.ml"});
+               Executable
+                 ({
+                     cs_name = "run_test";
+                     cs_data = PropList.Data.create ();
+                     cs_plugin_data = []
+                  },
+                   {
+                      bs_build =
+                        [
+                           (OASISExpr.EBool true, false);
+                           (OASISExpr.EFlag "tests", true)
+                        ];
+                      bs_install = [(OASISExpr.EBool true, false)];
+                      bs_path = "src";
+                      bs_compiled_object = Best;
+                      bs_build_depends =
+                        [
+                           FindlibPackage ("alcotest", None);
+                           FindlibPackage ("oUnit", None);
+                           FindlibPackage ("core", None);
+                           FindlibPackage ("threads", None);
+                           FindlibPackage ("core_extended", None);
+                           FindlibPackage ("atdgen", None)
+                        ];
+                      bs_build_tools =
+                        [ExternalTool "ocamlbuild"; ExternalTool "camlp4o"];
+                      bs_c_sources = [];
+                      bs_data_files = [];
+                      bs_ccopt = [(OASISExpr.EBool true, [])];
+                      bs_cclib = [(OASISExpr.EBool true, [])];
+                      bs_dlllib = [(OASISExpr.EBool true, [])];
+                      bs_dllpath = [(OASISExpr.EBool true, [])];
+                      bs_byteopt = [(OASISExpr.EBool true, [])];
+                      bs_nativeopt = [(OASISExpr.EBool true, [])]
+                   },
+                   {exec_custom = false; exec_main_is = "test/test.ml"});
+               Test
+                 ({
+                     cs_name = "tests";
+                     cs_data = PropList.Data.create ();
+                     cs_plugin_data = []
+                  },
+                   {
+                      test_type = (`Test, "custom", Some "0.4");
+                      test_command =
+                        [(OASISExpr.EBool true, ("$run_test", []))];
+                      test_custom =
+                        {
+                           pre_command = [(OASISExpr.EBool true, None)];
+                           post_command = [(OASISExpr.EBool true, None)]
+                        };
+                      test_working_directory = Some "src/test";
+                      test_run =
+                        [
+                           (OASISExpr.ENot (OASISExpr.EFlag "tests"), false);
+                           (OASISExpr.EFlag "tests", false);
+                           (OASISExpr.EAnd
+                              (OASISExpr.EFlag "tests",
+                                OASISExpr.EFlag "tests"),
+                             true)
+                        ];
+                      test_tools =
+                        [ExternalTool "ocamlbuild"; ExternalTool "camlp4o"]
+                   })
             ];
           plugins =
             [
@@ -6777,7 +7019,7 @@ let setup_t =
        };
      oasis_fn = Some "_oasis";
      oasis_version = "0.4.5";
-     oasis_digest = Some "\170\134\136a\241\018\026\"\180\230\139g\173\177&a";
+     oasis_digest = Some "\203\134\148\142Uh\206\188\027iR\241>##\179";
      oasis_exec = None;
      oasis_setup_args = [];
      setup_update = false
@@ -6785,6 +7027,6 @@ let setup_t =
 
 let setup () = BaseSetup.setup setup_t;;
 
-# 6789 "setup.ml"
+# 7031 "setup.ml"
 (* OASIS_STOP *)
 let () = setup ();;

+ 24 - 6
src/edit_command.ml

@@ -38,6 +38,11 @@ open Core.Std;;
 
 (* Module to edit command without editing the rc file directly *)
 
+(* Function to remove empty element in a list *)
+let epur =
+     List.filter ~f:(function "" -> false | _ -> true)
+;;
+
 (* Function to create a new list augmented by some commands *)
 (* TODO Factorise this *)
 let new_list current_list position new_items =
@@ -51,6 +56,21 @@ let new_list current_list position new_items =
 ;;
 
 
+(* Concat edited item, to have a proper list to display
+    * If only one element, return "elt".
+    * If more than one "\nelt1\nelt2\nelt3" *)
+let rec gen_modification items =
+    let r = "\n" in
+    epur items
+    |> (function
+        | [] -> ""
+        (* Only one element *)
+        | element :: [] -> element
+        (* The list as more than two elements *)
+        | _ ->
+                let msg = String.concat ~sep:r items in
+                String.concat [ r ; msg ; r ])
+;;
 
 (* Function which get the nth element, put it in a file, let the user edit it,
  * and then remplace with the new result *)
@@ -73,6 +93,7 @@ let run ~(rc:File_com.t) position =
 
     (* Edit file *)
     let edit = String.concat [ Lazy.force Const.editor ; " " ; tmp_edit ] in
+    Messages.debug edit;
     Sys.command edit
     |> (function
         0 -> ()
@@ -80,16 +101,13 @@ let run ~(rc:File_com.t) position =
         |> Messages.warning);
 
     (* Reading and applying the result *)
-    let new_commands = In_channel.read_lines tmp_edit in
+    let new_commands = In_channel.read_lines tmp_edit |> epur in
     let cmd_list = new_list shorter_list position new_commands in
     let updated_rc = { rc with Settings_t.progs = cmd_list} in
     File_com.write updated_rc;
     (* Display the result *)
-    sprintf "'%s' -> '%s'\n\n" original_command
-        (List.fold
-            ~f:(fun accum item -> String.concat [ accum ; item ; "\n" ])
-            ~init:""
-            new_commands)
+    sprintf "'%s' -> '%s'\n" original_command
+        (gen_modification new_commands)
         |> Messages.ok;
     let reread_rc = File_com.init_rc () in
     (* Display new rc file *)

+ 1 - 1
src/oclaunch.ml

@@ -38,7 +38,7 @@ open Core.Std;;
 
 (* Variable to store version number *)
 (* TODO Get value from file *)
-let version_number = "0.2.2-dev";;
+let version_number = "";;
 
 (* Variable store building information *)
 (* XXX This is fake value, it corresponds to the running

+ 3 - 0
src/test/.merlin

@@ -0,0 +1,3 @@
+PKG oUnit alcotest core
+
+S ../

+ 70 - 0
src/test/ec_t.ml

@@ -0,0 +1,70 @@
+(******************************************************************************)
+(* Copyright © Joly Clément, 2015                                             *)
+(*                                                                            *)
+(*  leowzukw@vmail.me                                                         *)
+(*                                                                            *)
+(*  Ce logiciel est un programme informatique servant à exécuter              *)
+(*  automatiquement des programmes à l'ouverture du terminal.                 *)
+(*                                                                            *)
+(*  Ce logiciel est régi par la licence CeCILL soumise au droit français et   *)
+(*  respectant les principes de diffusion des logiciels libres. Vous pouvez   *)
+(*  utiliser, modifier et/ou redistribuer ce programme sous les conditions    *)
+(*  de la licence CeCILL telle que diffusée par le CEA, le CNRS et l'INRIA    *)
+(*  sur le site "http://www.cecill.info".                                     *)
+(*                                                                            *)
+(*  En contrepartie de l'accessibilité au code source et des droits de copie, *)
+(*  de modification et de redistribution accordés par cette licence, il n'est *)
+(*  offert aux utilisateurs qu'une garantie limitée.  Pour les mêmes raisons, *)
+(*  seule une responsabilité restreinte pèse sur l'auteur du programme,  le   *)
+(*  titulaire des droits patrimoniaux et les concédants successifs.           *)
+(*                                                                            *)
+(*  A cet égard  l'attention de l'utilisateur est attirée sur les risques     *)
+(*  associés au chargement,  à l'utilisation,  à la modification et/ou au     *)
+(*  développement et à la reproduction du logiciel par l'utilisateur étant    *)
+(*  donné sa spécificité de logiciel libre, qui peut le rendre complexe à     *)
+(*  manipuler et qui le réserve donc à des développeurs et des professionnels *)
+(*  avertis possédant  des  connaissances  informatiques approfondies.  Les   *)
+(*  utilisateurs sont donc invités à charger  et  tester  l'adéquation  du    *)
+(*  logiciel à leurs besoins dans des conditions permettant d'assurer la      *)
+(*  sécurité de leurs systèmes et ou de leurs données et, plus généralement,  *)
+(*  à l'utiliser et l'exploiter dans les mêmes conditions de sécurité.        *)
+(*                                                                            *)
+(*  Le fait que vous puissiez accéder à cet en-tête signifie que vous avez    *)
+(*  pris connaissance de la licence CeCILL, et que vous en avez accepté les   *)
+(*  termes.                                                                   *)
+(******************************************************************************)
+
+open Core.Std;;
+
+(* A module containing tests for src/edit_command.ml *)
+
+(* Function epur *)
+let epur () =
+    let current = Edit_command.epur [ "qw" ; "" ; "erty" ; "a" ; "" ; "zerty"] in
+    let expected = [ "qw" ; "erty" ; "a" ; "zerty" ] in
+    OUnit.assert_equal current expected
+;;
+
+(* Function gen_modification *)
+let gm1 () =
+    let current = Edit_command.gen_modification [ "qw" ] in
+    let expected = "qw" in
+    OUnit.assert_equal current expected
+;;
+let gm2 () =
+    let current = Edit_command.gen_modification [ "qw" ; "erty" ; "a" ; "zerty"] in
+    let expected = "\nqw\nerty\na\nzerty\n" in
+    OUnit.assert_equal current expected
+;;
+
+let n_l =
+    [
+        ("Remove empty strings in list",`Quick, epur);
+        ("Summary of modifications : one element",`Quick, gm1);
+        ("Summary of modifications : several elements",`Quick, gm2);
+    ]
+;;
+
+(* To be used in test.ml *)
+let alco = [( "Edit_command.ml",n_l );];;
+

+ 44 - 0
src/test/test.ml

@@ -0,0 +1,44 @@
+(******************************************************************************)
+(* Copyright © Joly Clément, 2015                                             *)
+(*                                                                            *)
+(*  leowzukw@vmail.me                                                         *)
+(*                                                                            *)
+(*  Ce logiciel est un programme informatique servant à exécuter              *)
+(*  automatiquement des programmes à l'ouverture du terminal.                 *)
+(*                                                                            *)
+(*  Ce logiciel est régi par la licence CeCILL soumise au droit français et   *)
+(*  respectant les principes de diffusion des logiciels libres. Vous pouvez   *)
+(*  utiliser, modifier et/ou redistribuer ce programme sous les conditions    *)
+(*  de la licence CeCILL telle que diffusée par le CEA, le CNRS et l'INRIA    *)
+(*  sur le site "http://www.cecill.info".                                     *)
+(*                                                                            *)
+(*  En contrepartie de l'accessibilité au code source et des droits de copie, *)
+(*  de modification et de redistribution accordés par cette licence, il n'est *)
+(*  offert aux utilisateurs qu'une garantie limitée.  Pour les mêmes raisons, *)
+(*  seule une responsabilité restreinte pèse sur l'auteur du programme,  le   *)
+(*  titulaire des droits patrimoniaux et les concédants successifs.           *)
+(*                                                                            *)
+(*  A cet égard  l'attention de l'utilisateur est attirée sur les risques     *)
+(*  associés au chargement,  à l'utilisation,  à la modification et/ou au     *)
+(*  développement et à la reproduction du logiciel par l'utilisateur étant    *)
+(*  donné sa spécificité de logiciel libre, qui peut le rendre complexe à     *)
+(*  manipuler et qui le réserve donc à des développeurs et des professionnels *)
+(*  avertis possédant  des  connaissances  informatiques approfondies.  Les   *)
+(*  utilisateurs sont donc invités à charger  et  tester  l'adéquation  du    *)
+(*  logiciel à leurs besoins dans des conditions permettant d'assurer la      *)
+(*  sécurité de leurs systèmes et ou de leurs données et, plus généralement,  *)
+(*  à l'utiliser et l'exploiter dans les mêmes conditions de sécurité.        *)
+(*                                                                            *)
+(*  Le fait que vous puissiez accéder à cet en-tête signifie que vous avez    *)
+(*  pris connaissance de la licence CeCILL, et que vous en avez accepté les   *)
+(*  termes.                                                                   *)
+(******************************************************************************)
+
+open Core.Std;;
+
+(* A module launching all tests *)
+
+let () =
+    Alcotest.run "Test suite for the project"
+        (List.concat [ Ec_t.alco ])
+;;