Parcourir la source

Add unit tests

Leo il y a 10 ans
Parent
commit
5c354c1f86
11 fichiers modifiés avec 401 ajouts et 14 suppressions
  1. 2 0
      .gitignore
  2. 1 0
      CHANGELOG.md
  3. 4 2
      INSTALL.md
  4. 14 0
      _oasis
  5. 16 1
      _tags
  6. 8 3
      myocamlbuild.ml
  7. 3 1
      setup.data
  8. 250 7
      setup.ml
  9. 3 0
      src/test/.merlin
  10. 56 0
      src/test/ec_t.ml
  11. 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

+ 1 - 0
CHANGELOG.md

@@ -3,6 +3,7 @@
 ## 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

+ 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
 ==========

+ 14 - 0
_oasis

@@ -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

+ 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;;

+ 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 - 7
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: facda6205b6c2f62ccec277c5a0df974) *)
 (*
    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 =
        {
@@ -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,8 @@ 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 "w\231\183\238E\027\192\029\180\212\172\209\001\200h\003";
      oasis_exec = None;
      oasis_setup_args = [];
      setup_update = false
@@ -6785,6 +7028,6 @@ let setup_t =
 
 let setup () = BaseSetup.setup setup_t;;
 
-# 6789 "setup.ml"
+# 7032 "setup.ml"
 (* OASIS_STOP *)
 let () = setup ();;

+ 3 - 0
src/test/.merlin

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

+ 56 - 0
src/test/ec_t.ml

@@ -0,0 +1,56 @@
+(******************************************************************************)
+(* 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
+;;
+
+let n_l =
+    [
+        ("Remove empty strings in list",`Quick, epur);
+    ]
+;;
+
+(* 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 ])
+;;