--- a
+++ b/tests/TESTS_MusOptTool.m
@@ -0,0 +1,57 @@
+%% TEST1: map a model on itself
+% check that generally the algorithm optimizes models as expected.
+% If asked to map a model on the same model, the optimization should
+% converge on the initial values of the target model.
+clear; 
+% add opensim API
+import org.opensim.modeling.*
+% add tools
+addpath('../MATLAB_tool/MuscleParOptTool')
+
+% setup the optimization
+reference_model = './models/gait2392_simbody.osim';
+target_model    = reference_model;
+N_eval = 5;
+log_folder = './test1_logs';
+
+% optimize
+[osimModel_opt, SimsInfo] = optimMuscleParams(reference_model, target_model, N_eval, log_folder);
+
+% test
+assert(min(max(SimsInfo.LmOptLts_opt-SimsInfo.LmOptLts_ref)<1.0e-14));
+
+%% TEST2: reproduce parameter optimization from MATLAB example
+clear; 
+% add opensim API
+import org.opensim.modeling.*
+% add tools
+addpath('../MATLAB_tool/MuscleParOptTool')
+
+% setup the optimization
+reference_model = './models/test2_reference.osim';
+target_model    = './models/test2_target.osim';
+N_eval = 10;
+log_folder = './test2_logs';
+
+% optimize
+[osimModel_opt, SimsInfo] = optimMuscleParams(reference_model, target_model, N_eval, log_folder);
+
+% test
+expected_model  = './models/test2_expected.osim';
+osimExp = Model(expected_model);
+% load muscles
+exp_mus = osimExp.getMuscles();
+opt_mus = osimModel_opt.getMuscles();
+% define a loss
+loss = 0;
+% compare musculotendon properties between optimized and expected 
+for n = 0:opt_mus.getSize()-1
+    cur_opt_mus = opt_mus.get(n);
+    cur_exp_mus = exp_mus.get(n);
+    dL = abs(cur_opt_mus.getOptimalFiberLength()- cur_exp_mus.getOptimalFiberLength());
+    dT = abs(cur_opt_mus.getTendonSlackLength()- cur_exp_mus.getTendonSlackLength());
+    loss = loss+dL+dT;
+end
+
+%test
+assert(loss<1.0e-14);
\ No newline at end of file