diff --git a/tests/test_functional.py b/tests/test_functional.py
new file mode 100644
index 0000000000000000000000000000000000000000..ed8296b0943ef90a006d418e14163235d59e107f
--- /dev/null
+++ b/tests/test_functional.py
@@ -0,0 +1,642 @@
+"""Functional tests for FRAG.py"""
+
+import os
+import unittest.mock
+import pytest
+from io import StringIO
+from .context import rpg
+from rpg import RapidPeptidesGenerator
+
+@pytest.fixture
+def truth():
+    """ Solution """
+    return [">A0A2C9KB11/1065-1162_0_Trypsin_2_2_289.29138_6.73\n",
+            "DR\n",
+            ">A0A2C9KB11/1065-1162_1_Trypsin_10_8_935.00128_4.12\n",
+            "EALDSSWK\n",
+            ">A0A2C9KB11/1065-1162_2_Trypsin_11_1_146.18938_10.04\n",
+            "K\n",
+            ">A0A2C9KB11/1065-1162_3_Trypsin_13_2_287.36218_11.04\n",
+            "LR\n",
+            ">A0A2C9KB11/1065-1162_4_Trypsin_19_6_503.51548_11.04\n",
+            "SGAGGR\n",
+            ">A0A2C9KB11/1065-1162_5_Trypsin_20_1_146.18938_10.04\n",
+            "K\n",
+            ">A0A2C9KB11/1065-1162_6_Trypsin_25_5_529.59668_11.04\n",
+            "NAGIR\n",
+            ">A0A2C9KB11/1065-1162_7_Trypsin_38_13_1623.99478_7.79\n",
+            "LVLWMLDHVPNMR\n",
+            ">A0A2C9KB11/1065-1162_8_Trypsin_42_4_535.60048_10.04\n",
+            "NQFK\n",
+            ">A0A2C9KB11/1065-1162_9_Trypsin_43_1_146.18938_10.04\n",
+            "K\n",
+            ">A0A2C9KB11/1065-1162_10_Trypsin_54_11_1297.43618_7.79\n",
+            "FAHQPDSVLQR\n",
+            ">A0A2C9KB11/1065-1162_11_Trypsin_64_10_1189.29028_3.74\n",
+            "DPEFLAQVDR\n",
+            ">A0A2C9KB11/1065-1162_12_Trypsin_88_24_2545.84688_3.47\n",
+            "ILGGVESMINNVDDPVALEAAFDR\n",
+            ">A0A2C9KB11/1065-1162_13_Trypsin_97_9_958.09728_4.96\n",
+            "LADAHLSMT\n",
+            ">A0A2C9KB11/1221-1332_0_Trypsin_2_2_303.31828_6.94\n",
+            "ER\n",
+            ">A0A2C9KB11/1221-1332_1_Trypsin_3_1_146.18938_10.04\n",
+            "K\n",
+            ">A0A2C9KB11/1221-1332_2_Trypsin_6_3_330.42758_10.04\n",
+            "ALK\n",
+            ">A0A2C9KB11/1221-1332_3_Trypsin_13_7_821.88518_6.71\n",
+            "SSWDSLK\n",
+            ">A0A2C9KB11/1221-1332_4_Trypsin_38_25_2643.03068_6.94\n",
+            "SAAGGSQEAGVNLVLWMLQNVPNMR\n",
+            ">A0A2C9KB11/1221-1332_5_Trypsin_40_2_289.29138_6.73\n",
+            "DR\n",
+            ">A0A2C9KB11/1221-1332_6_Trypsin_53_13_1463.56938_5.12\n",
+            "FTFNAHQGDDALK\n",
+            ">A0A2C9KB11/1221-1332_7_Trypsin_60_7_792.88708_4.12\n",
+            "ADAEFIK\n",
+            ">A0A2C9KB11/1221-1332_8_Trypsin_64_4_529.59678_11.04\n",
+            "QVQR\n",
+            ">A0A2C9KB11/1221-1332_9_Trypsin_81_17_1804.98958_3.74\n",
+            "ITGGLESMIDNLDNQGK\n",
+            ">A0A2C9KB11/1221-1332_10_Trypsin_88_7_785.89848_6.73\n",
+            "LQAAIDR\n",
+            ">A0A2C9KB11/1221-1332_11_Trypsin_110_22_2524.91728_5.22\n",
+            "LVDAHLHMTPSVGLEYFEPLQK\n",
+            ">A0A2C9KB11/1221-1332_12_Trypsin_111_1_132.11908_5.97\n",
+            "N\n",
+            ">A0A2C9KB11/1378-1486_0_Trypsin_2_2_289.29138_6.73\n",
+            "DR\n",
+            ">A0A2C9KB11/1378-1486_1_Trypsin_3_1_146.18938_10.04\n",
+            "K\n",
+            ">A0A2C9KB11/1378-1486_2_Trypsin_10_7_912.00988_6.87\n",
+            "YIESSWK\n",
+            ">A0A2C9KB11/1378-1486_3_Trypsin_11_1_146.18938_10.04\n",
+            "K\n",
+            ">A0A2C9KB11/1378-1486_4_Trypsin_21_10_947.99758_4.12\n",
+            "LTDAAGGSEK\n",
+            ">A0A2C9KB11/1378-1486_5_Trypsin_38_17_1994.29828_6.73\n",
+            "AGTNFVFWLLDNVPNMR\n",
+            ">A0A2C9KB11/1378-1486_6_Trypsin_40_2_289.29138_6.73\n",
+            "DR\n",
+            ">A0A2C9KB11/1378-1486_7_Trypsin_59_19_2255.34168_3.97\n",
+            "FTFNAHQSDAALQEDEEFR\n",
+            ">A0A2C9KB11/1378-1486_8_Trypsin_63_4_487.55648_10.04\n",
+            "NQVK\n",
+            ">A0A2C9KB11/1378-1486_9_Trypsin_108_45_4677.21938_3.88\n",
+            "AITGGIESFVNNVNNPAALQSSIETLVDAHLNMQPSIGLSYFGSV\n",
+            ">A0A2C9KB11/1535-1643_0_Trypsin_2_2_289.29138_6.73\n",
+            "DR\n",
+            ">A0A2C9KB11/1535-1643_1_Trypsin_3_1_174.20278_11.04\n",
+            "R\n",
+            ">A0A2C9KB11/1535-1643_2_Trypsin_10_7_775.90298_10.04\n",
+            "AVVSSWK\n",
+            ">A0A2C9KB11/1535-1643_3_Trypsin_11_1_146.18938_10.04\n",
+            "K\n",
+            ">A0A2C9KB11/1535-1643_4_Trypsin_17_6_603.67618_11.04\n",
+            "LTASGR\n",
+            ">A0A2C9KB11/1535-1643_5_Trypsin_36_19_2281.67528_6.73\n",
+            "QSFGIDLVLWMFNNVPNMR\n",
+            ">A0A2C9KB11/1535-1643_6_Trypsin_44_8_985.06128_4.12\n",
+            "EQFTFDAK\n",
+            ">A0A2C9KB11/1535-1643_7_Trypsin_51_7_803.82708_3.92\n",
+            "QSDADLR\n",
+            ">A0A2C9KB11/1535-1643_8_Trypsin_52_1_174.20278_11.04\n",
+            "R\n",
+            ">A0A2C9KB11/1535-1643_9_Trypsin_58_6_732.83448_6.71\n",
+            "DPNFLK\n",
+            ">A0A2C9KB11/1535-1643_10_Trypsin_79_21_2158.36788_3.62\n",
+            "QVNSIVNGLGDMVDSVNDPGK\n",
+            ">A0A2C9KB11/1535-1643_11_Trypsin_86_7_842.95038_6.94\n",
+            "LQANLER\n",
+            ">A0A2C9KB11/1535-1643_12_Trypsin_108_22_2521.94168_5.27\n",
+            "LSEIHLHFVPSVGPEFFVPLEK\n",
+            ">A0A2C9K1A5/128-239_0_Trypsin_3_3_374.43738_6.71\n",
+            "DIK\n",
+            ">A0A2C9K1A5/128-239_1_Trypsin_11_8_919.98958_6.71\n",
+            "ALDSSWNK\n",
+            ">A0A2C9K1A5/128-239_2_Trypsin_19_8_759.81728_6.73\n",
+            "LTAGADGR\n",
+            ">A0A2C9K1A5/128-239_3_Trypsin_37_18_2120.51518_11.04\n",
+            "TTFGNNLVLWMLNVPNMR\n",
+            ">A0A2C9K1A5/128-239_4_Trypsin_39_2_303.31828_6.94\n",
+            "ER\n",
+            ">A0A2C9K1A5/128-239_5_Trypsin_42_3_392.49858_10.04\n",
+            "FVK\n",
+            ">A0A2C9K1A5/128-239_6_Trypsin_53_11_1259.34088_5.26\n",
+            "FNAHQSDEALK\n",
+            ">A0A2C9K1A5/128-239_7_Trypsin_60_7_835.91208_4.12\n",
+            "NDAEFIK\n",
+            ">A0A2C9K1A5/128-239_8_Trypsin_63_3_373.45268_10.04\n",
+            "QVK\n",
+            ">A0A2C9K1A5/128-239_9_Trypsin_111_48_5318.17868_5.79\n",
+            "LIVGGLQTLIINLNNPGQLQASIEHLADVHLHMKPSIGLEYFKPLQEN\n",
+            ">A0A2C9K1A5/285-395_0_Trypsin_2_2_261.27798_6.71\n",
+            "DK\n",
+            ">A0A2C9K1A5/285-395_1_Trypsin_11_9_1034.13688_6.94\n",
+            "VALESSWSR\n",
+            ">A0A2C9K1A5/285-395_2_Trypsin_19_8_758.87288_10.04\n",
+            "LTAGVNGK\n",
+            ">A0A2C9K1A5/285-395_3_Trypsin_20_1_174.20278_11.04\n",
+            "R\n",
+            ">A0A2C9K1A5/285-395_4_Trypsin_25_5_515.56988_11.04\n",
+            "NAGVR\n",
+            ">A0A2C9K1A5/285-395_5_Trypsin_37_12_1520.87088_6.73\n",
+            "LVLWMFNVPDMR\n",
+            ">A0A2C9K1A5/285-395_6_Trypsin_39_2_303.31828_6.94\n",
+            "ER\n",
+            ">A0A2C9K1A5/285-395_7_Trypsin_42_3_422.48448_11.04\n",
+            "FTR\n",
+            ">A0A2C9K1A5/285-395_8_Trypsin_46_4_478.54858_10.04\n",
+            "FNAK\n",
+            ">A0A2C9K1A5/285-395_9_Trypsin_53_7_789.84058_4.12\n",
+            "QSDEALK\n",
+            ">A0A2C9K1A5/285-395_10_Trypsin_60_7_822.91338_4.12\n",
+            "TDAEFLK\n",
+            ">A0A2C9K1A5/285-395_11_Trypsin_85_25_2798.14518_3.53\n",
+            "QVDVIIGGFETLINNLNDPTLLQDR\n",
+            ">A0A2C9K1A5/285-395_12_Trypsin_96_11_1225.36408_4.48\n",
+            "LESLADAHLEK\n",
+            ">A0A2C9K1A5/285-395_13_Trypsin_110_14_1504.79238_10.18\n",
+            "KPAIGVSYFGPLQK\n",
+            ">A0A2C9K1A5/588-698_0_Trypsin_2_2_261.27798_6.71\n",
+            "DK\n",
+            ">A0A2C9K1A5/588-698_1_Trypsin_3_1_146.18938_10.04\n",
+            "K\n",
+            ">A0A2C9K1A5/588-698_2_Trypsin_25_22_2285.50118_10.04\n",
+            "ALQSSWNTLVNQAGGQQNAGIK\n",
+            ">A0A2C9K1A5/588-698_3_Trypsin_37_12_1519.88608_11.04\n",
+            "LVLWMFNVPNMR\n",
+            ">A0A2C9K1A5/588-698_4_Trypsin_39_2_289.29138_6.73\n",
+            "DR\n",
+            ">A0A2C9K1A5/588-698_5_Trypsin_42_3_380.44418_10.04\n",
+            "FSK\n",
+            ">A0A2C9K1A5/588-698_6_Trypsin_53_11_1204.26148_5.12\n",
+            "FNAHSSDDALK\n",
+            ">A0A2C9K1A5/588-698_7_Trypsin_60_7_792.88708_4.12\n",
+            "ADAEFLK\n",
+            ">A0A2C9K1A5/588-698_8_Trypsin_81_21_2198.41478_3.53\n",
+            "QVNVIVGGLESLVNNVDDADK\n",
+            ">A0A2C9K1A5/588-698_9_Trypsin_88_7_771.87168_6.94\n",
+            "LQAGVER\n",
+            ">A0A2C9K1A5/588-698_10_Trypsin_110_22_2438.78338_5.08\n",
+            "LVDAHLHMSPSVGLEYFGPLQQ\n",
+            ">A0A2C9K1A5/745-855_0_Trypsin_2_2_289.29138_6.73\n",
+            "DR\n",
+            ">A0A2C9K1A5/745-855_1_Trypsin_3_1_146.18938_10.04\n",
+            "K\n",
+            ">A0A2C9K1A5/745-855_2_Trypsin_7_4_515.61028_6.94\n",
+            "VLER\n",
+            ">A0A2C9K1A5/745-855_3_Trypsin_19_12_1257.41158_10.04\n",
+            "TWNQLISGPGGK\n",
+            ">A0A2C9K1A5/745-855_4_Trypsin_21_2_275.30488_6.92\n",
+            "EK\n",
+            ">A0A2C9K1A5/745-855_5_Trypsin_25_4_387.47948_10.04\n",
+            "AGIK\n",
+            ">A0A2C9K1A5/745-855_6_Trypsin_38_13_1649.00158_6.94\n",
+            "LVLWMFENVPNMR\n",
+            ">A0A2C9K1A5/745-855_7_Trypsin_43_5_623.66348_6.71\n",
+            "DQFSK\n",
+            ">A0A2C9K1A5/745-855_8_Trypsin_48_5_616.67448_7.77\n",
+            "FDAHK\n",
+            ">A0A2C9K1A5/745-855_9_Trypsin_60_12_1349.50358_4.49\n",
+            "SDEALSKPEFVK\n",
+            ">A0A2C9K1A5/745-855_10_Trypsin_96_36_3961.35988_4.25\n",
+            "QVNNIFGGLESILNNLNKPGQLQSALENLADDHLDR\n",
+            ">A0A2C9K1A5/745-855_11_Trypsin_99_3_399.49358_11.53\n",
+            "KPR\n",
+            ">A0A2C9K1A5/745-855_12_Trypsin_110_11_1248.48748_6.92\n",
+            "IGLEFFGPLQK\n",
+            ">A0A2C9K1A5/935-1004_0_Trypsin_10_10_1288.50498_7.8\n",
+            "QMFEHVPNMR\n",
+            ">A0A2C9K1A5/935-1004_1_Trypsin_15_5_651.71728_6.92\n",
+            "EQFTK\n",
+            ">A0A2C9K1A5/935-1004_2_Trypsin_26_11_1211.34268_7.77\n",
+            "FDAHQPNAALK\n",
+            ">A0A2C9K1A5/935-1004_3_Trypsin_37_11_1258.39948_6.94\n",
+            "QNPEFLAQVGR\n",
+            ">A0A2C9K1A5/935-1004_4_Trypsin_55_18_1881.15618_3.74\n",
+            "ILGGIESLLNNDDPVALK\n",
+            ">A0A2C9K1A5/935-1004_5_Trypsin_60_5_544.60838_6.73\n",
+            "AAIDR\n",
+            ">A0A2C9K1A5/935-1004_6_Trypsin_69_9_944.07038_4.96\n",
+            "LADAHLSMS\n"]
+
+@pytest.fixture
+def file_a(tmpdir):
+    """ Good fasta file """
+    file_name = tmpdir.join("A.fasta")
+    file_name.write(">A0A2C9KB11/1065-1162\n"\
+                 "DREALDSSWKKLRSgagGRKNAGIRLVLWMLDHVPNMRNQFKKFAHQPDSVLQRDPE\n"\
+                 "FLAQVDRILGGVESMINNVDDPVALEAAFDRLADAHLSMT\n"\
+                 ">A0A2C9KB11/1221-1332\n"\
+                 "ERKALKSSWDSLKSaagGSQEAGVNLVLWMLQNVPNMRDRFTFNAHQGDDALKADAE\n"\
+                 "FIKQVQRITGGLESMIDNLDNQGKLQAAIDRLVDAHLHMTpSVGLEYFEPLQKN\n"\
+                 ">A0A2C9KB11/1378-1486\n"\
+                 "DRKYIESSWKKLTDaagGSEKAGTNFVFWLLDNVPNMRDRFTFNAHQSDAALQEDEE\n"\
+                 "FRNQVKAITGGIESFVNNVNNPAALQSSIETLVDAHLNMQpSIGLSYFGSV\n"\
+                 ">A0A2C9KB11/1535-1643\n"\
+                 "DRRAVVSSWKKLTAsGRQSFGIDLVLWMFNNVPNMREQFTFDAKQSDADLRRDPNFL\n"\
+                 "KQVNSIVNGLGDMVDSVNDPGKLQANLERLSEIHLHFVpSVGPEFFVPLEK\n"\
+                 ">A0A2C9K1A5/128-239\n"\
+                 "DIKALDSSWNKLTAgadGRTTFGNNLVLWMLNVPNMRERFVKFNAHQSDEALKNDAE\n"\
+                 "FIKQVKLIVGGLQTLIINLNNPGQLQASIEHLADVHLHMKpSIGLEYFKPLQEN\n"\
+                 ">A0A2C9K1A5/285-395\n"\
+                 "DKVALESSWSRLTAgvnGKRNAGVRLVLWMFNVPDMRERFTRFNAKQSDEALKTDAE\n"\
+                 "FLKQVDVIIGGFETLINNLNDPTLLQDRLESLADAHLEKKpAIGVSYFGPLQK\n"\
+                 ">A0A2C9K1A5/588-698\n"\
+                 "DKKALQSSWNTLVNqagGQQNAGIKLVLWMFNVPNMRDRFSKFNAHSSDDALKADAE\n"\
+                 "FLKQVNVIVGGLESLVNNVDDADKLQAGVERLVDAHLHMSpSVGLEYFGPLQQ\n"\
+                 ">A0A2C9K1A5/745-855\n"\
+                 "DRKVLERTWNQLISgpgGKEKAGIKLVLWMFENVPNMRDQFSKFDAHKSDEALSKPE\n"\
+                 "FVKQVNNIFGGLESILNNLNKPGQLQSALENLADDHLDRKpRIGLEFFGPLQK\n"\
+                 ">A0A2C9K1A5/935-1004\n"\
+                 "QMFEHVPNMREQFTKFDAHQPNAALKQNPEFLAQVGRILGGIESLLNNDDPVALKAA\n"\
+                 "IDRLADAHLSMS\n")
+    return file_name
+
+@pytest.fixture
+def list_enz():
+    """ Result for listing enzymes """
+    return "1: Arg-C\n"\
+           "2: Asp-N\n"\
+           "3: BNPS-Skatole\n"\
+           "4: Bromelain\n"\
+           "5: Caspase-1\n"\
+           "6: Caspase-2\n"\
+           "7: Caspase-3\n"\
+           "8: Caspase-4\n"\
+           "9: Caspase-5\n"\
+           "10: Caspase-6\n"\
+           "11: Caspase-7\n"\
+           "12: Caspase-8\n"\
+           "13: Caspase-9\n"\
+           "14: Caspase-10\n"\
+           "15: Chymotrypsin-high\n"\
+           "16: Chymotrypsin-low\n"\
+           "17: Clostripain\n"\
+           "18: CNBr\n"\
+           "19: Enterokinase\n"\
+           "20: Factor-Xa\n"\
+           "21: Ficin\n"\
+           "22: Formic-acid\n"\
+           "23: Glu-C\n"\
+           "24: Glutamyl-endopeptidase\n"\
+           "25: Granzyme-B\n"\
+           "26: Hydroxylamine\n"\
+           "27: Iodosobenzoic-acid\n"\
+           "28: Lys-C\n"\
+           "29: Lys-N\n"\
+           "30: Neutrophil-elastase\n"\
+           "31: NTCB\n"\
+           "32: Papain\n"\
+           "33: Pepsin-pH1.3\n"\
+           "34: Pepsin-pH>=2\n"\
+           "35: Proline-endopeptidase\n"\
+           "36: Proteinase-K\n"\
+           "37: Staphylococcal-peptidase-I\n"\
+           "38: Thermolysin\n"\
+           "39: Thrombin\n"\
+           "40: Thrombin-SG\n"\
+           "41: Tobacco-Etch-Virus\n"\
+           "42: Trypsin"
+
+@pytest.fixture
+def res_dig_1_42():
+    """ Result for digestion with 1 and 42 """
+    return ">Input_0_Arg-C_2_2_289.29138_6.73\n"\
+           "DR\n"\
+           ">Input_1_Arg-C_13_11_1332.52228_9.84\n"\
+           "EALDSSWKKLR\n"\
+           ">Input_2_Arg-C_19_6_503.51548_11.04\n"\
+           "SGAGGR\n"\
+           ">Input_3_Arg-C_25_6_657.77078_11.53\n"\
+           "KNAGIR\n"\
+           ">Input_4_Arg-C_44_19_2283.62998_4.19\n"\
+           "LVLWMLDFDAHQPDSVLQR\n"\
+           ">Input_5_Arg-C_47_3_407.46678_3.36\n"\
+           "EFL\n"\
+           ">Input_0_Trypsin_2_2_289.29138_6.73\n"\
+           "DR\n"\
+           ">Input_1_Trypsin_10_8_935.00128_4.12\n"\
+           "EALDSSWK\n"\
+           ">Input_2_Trypsin_11_1_146.18938_10.04\n"\
+           "K\n"\
+           ">Input_3_Trypsin_13_2_287.36218_11.04\n"\
+           "LR\n"\
+           ">Input_4_Trypsin_19_6_503.51548_11.04\n"\
+           "SGAGGR\n"\
+           ">Input_5_Trypsin_20_1_146.18938_10.04\n"\
+           "K\n"\
+           ">Input_6_Trypsin_25_5_529.59668_11.04\n"\
+           "NAGIR\n"\
+           ">Input_7_Trypsin_44_19_2283.62998_4.19\n"\
+           "LVLWMLDFDAHQPDSVLQR\n"\
+           ">Input_8_Trypsin_47_3_407.46678_3.36\n"\
+           "EFL\n"
+
+def test_wrong_file(tmpdir, capsys):
+    """ Try the full software with wrong fasta file """
+    # False file A
+    false_file_a = tmpdir.join("FalseA.fasta")
+    false_file_a.write("?A0A2C9KB11/1065-1162\n"\
+                       "DREALDSSWKKLRSgagGRKNAGIRLVLWMLDHVPNMRAHQPDSVLQREFL\n"\
+                       "AQVDRILGGVESMINNVDDPVALEAAFDRLADAHLSMT\n"\
+                       ">A0A2C9KB11/1221-1332\n"\
+                       "ERKALKSSWDSLKSaagGSQEAGVNLVLWMLQNVTKFNAHQGDDALKAEFI\n"\
+                       "KQVQRITGGLESMIDNLDNQGKLQAAIDRLVDAHLHMTpSVGLEYEPLQKN\n")
+
+    with pytest.raises(SystemExit) as pytest_wrapped_e:
+        with unittest.mock.patch("sys.argv", ["func_test",
+                                              "-i", str(false_file_a),
+                                              "-e", str(42)]):
+            RapidPeptidesGenerator.main()
+    assert pytest_wrapped_e.value.code == 1
+    # Error output
+    captured = capsys.readouterr()
+    assert "Input Error: input file format not recognized (?)." in captured.err
+
+def test_wrong_file_in_middle(tmpdir, capsys):
+    """ Try the full software with wrong fasta file (error in the middle) """
+    # False file A
+    false_file_a_mid = tmpdir.join("FalseAmid.fasta")
+    false_file_a_mid.write(">A0A2C9KB11/1065-1162\n"\
+                           "DREALDSSWKKLRSgagGRKNAGIRLVLWMLDFDAHQPDSVLQREFL\n"\
+                           "AQVDRILGGVESMINNVDDPVALEAAFDRLADAHLSMT\n"\
+                           ">A0A2C9KB11/1221-1332\n"\
+                           "ERKALKSSWDSLKSaagGSQEAGVNLVLWMLQNVPNQGDDALKAEFI\n"\
+                           "KQVQRITGGLESMIDNLDNQGKLQAAIDRLVDAHLHMTpSVGLLQKN\n"\
+                           ">A0A2C9KB11/1378-1486\n"\
+                           "DRKYIESSWKKLTDaagGSEKAGTNFVFWLLDNVPHQSDAALQEDFR\n"\
+                           "NQVKAITGGIESFVNNVNNPAALQSSIETLVDAHLNMQpSIGLSYSV\n"\
+                           "?A0A2C9KB11/1535-1643\n"\
+                           "DRRAVVSSWKKLTAsGRQSFGIDLVLWMFNNVPNMSDADLRRDFLKQ\n"\
+                           "VNSIVNGLGDMVDSVNDPGKLQANLERLSEIHLHFVpSVGPEFFVEK\n"\
+                           ">A0A2C9K1A5/128-239\n"\
+                           "DIKALDSSWNKLTAgadGRTTFGNNLVLWMLDNVPNMSDEALKNEFI\n"\
+                           "KQVKLIVGGLQTLIINLNNPGQLQASIEHLADVHLHMKpSIGLLQEN\n"\
+                           ">A0A2C9K1A5/285-395\n"\
+                           "DKVALESSWSRLTAgvnGKRNAGVRLVLWMFNAKQSDEALKTDAEFL\n"\
+                           "KQVDVIIGGFETLINNLNDPTLLQDRLESLADAHLEKKpAIGVPLQK\n"\
+                           ">A0A2C9K1A5/588-698\n"\
+                           "DKKALQSSQNAGIKLVLWMFDNVPNMRFSKFNAHSSDDALKADAEFL\n"\
+                           "KQVNVIVGGLESLVNNDKLQAGVERLVDAHLHMSpSVGLEYFGPLQQ\n"\
+                           ">A0A2C9K1A5/745-855\n"\
+                           "DRKVLERTWNQLISgpgGKEENVPNMRDSKFDAHKSDEALSKDPEFV\n"\
+                           "KQVNNIFGGLESILNNLNKPGQLQSALENLADDHLDRKpRIGGPLQK\n"\
+                           ">A0A2C9K1A5/935-1004\n"\
+                           "QMFEHVPNMREQFTKFDAHQPNAALKQNPEFLLNNLDDPVALKAAID\n"\
+                           "RLADAHLSMS\n")
+
+    with pytest.raises(SystemExit) as pytest_wrapped_e:
+        with unittest.mock.patch("sys.argv", ["func_test",
+                                              "-i", str(false_file_a_mid),
+                                              "-e", str(42)]):
+            RapidPeptidesGenerator.main()
+    assert pytest_wrapped_e.value.code == 1
+    # Error output
+    captured = capsys.readouterr()
+    assert "Input Error: amino acid \"?\" in DRKYIESSWKKLTDAAGGSEKAGTNFVFWLLD"\
+           "NVPHQSDAALQEDFRNQVKAITGGIESFVNNVNNPAALQSSIETLVDAHLNMQPSIGLSYSV?A0"\
+           "A2C9KB11/1535-1643DRRAVVSSWKKLTASGRQSFGIDLVLWMFNNVPNMSDADLRRDFLKQ"\
+           "VNSIVNGLGDMVDSVNDPGKLQANLERLSEIHLHFVPSVGPEFFVEK not recognized"\
+           "." in captured.err
+
+def test_l_option(capsys, list_enz):
+    """ Test -l behavior """
+    with pytest.raises(SystemExit) as pytest_wrapped_e:
+        with unittest.mock.patch("sys.argv", ["func_test",
+                                              "-l"]):
+            RapidPeptidesGenerator.main()
+    # Check normal exit
+    assert pytest_wrapped_e.value.code == 0
+    # Output
+    captured = capsys.readouterr()
+    assert list_enz in captured.out
+
+def test_s_option(capsys, res_dig_1_42):
+    """ Test -s behavior """
+    with unittest.mock.patch("sys.argv", ["func_test",
+                                          "-s", "DREALDSSWKKLRSgagGRKNAGI"\
+                                                "RLVLWMLDFDAHQPDSVLQREFL",
+                                          "-e", "1", "42"]):
+        RapidPeptidesGenerator.main()
+    # Output
+    captured = capsys.readouterr()
+    assert res_dig_1_42 in captured.out
+
+def test_d_option(capsys):
+    """ Test -d behavior """
+    # sequential
+    with unittest.mock.patch("sys.argv", ["func_test",
+                                          "-s", "PKPKPKPK",
+                                          "-e", "28", "29", "-d", "s"]):
+        RapidPeptidesGenerator.main()
+    # Output
+    captured = capsys.readouterr()
+    assert "Input_0_Lys-C_2_2_243.30608_10.04\nPK\n"\
+           ">Input_1_Lys-C_4_2_243.30608_10.04\nPK\n"\
+           ">Input_2_Lys-C_6_2_243.30608_10.04\nPK\n"\
+           ">Input_3_Lys-C_8_2_243.30608_10.04\nPK\n"\
+           ">Input_0_Lys-N_1_1_115.13198_5.97\nP\n"\
+           ">Input_1_Lys-N_3_2_243.30608_10.04\nKP\n"\
+           ">Input_2_Lys-N_5_2_243.30608_10.04\nKP\n"\
+           ">Input_3_Lys-N_7_2_243.30608_10.04\nKP\n"\
+           ">Input_4_Lys-N_8_1_146.18938_10.04\nK\n" in captured.out
+    # concurrent
+    with unittest.mock.patch("sys.argv", ["func_test",
+                                          "-s", "PKPKPKPK",
+                                          "-e", "28", "29", "-d", "c"]):
+        RapidPeptidesGenerator.main()
+    # Output
+    captured = capsys.readouterr()
+    assert ">Input_0_Lys-C-Lys-N_1_1_115.13198_5.97\nP\n"\
+           ">Input_1_Lys-C-Lys-N_2_1_146.18938_10.04\nK\n"\
+           ">Input_2_Lys-C-Lys-N_3_1_115.13198_5.97\nP\n"\
+           ">Input_3_Lys-C-Lys-N_4_1_146.18938_10.04\nK\n"\
+           ">Input_4_Lys-C-Lys-N_5_1_115.13198_5.97\nP\n"\
+           ">Input_5_Lys-C-Lys-N_6_1_146.18938_10.04\nK\n"\
+           ">Input_6_Lys-C-Lys-N_7_1_115.13198_5.97\nP\n"\
+           ">Input_7_Lys-C-Lys-N_8_1_146.18938_10.04\nK\n" in captured.out
+
+def test_p_option(capsys):
+    """ Test -p behavior """
+    # default
+    with unittest.mock.patch("sys.argv", ["func_test",
+                                          "-s", "PKPKPKPK",
+                                          "-e", "28", "29", "-p", "ipc"]):
+        RapidPeptidesGenerator.main()
+    # Output
+    captured = capsys.readouterr()
+    assert "Input_0_Lys-C_2_2_243.30608_10.04\nPK\n"\
+           ">Input_1_Lys-C_4_2_243.30608_10.04\nPK\n"\
+           ">Input_2_Lys-C_6_2_243.30608_10.04\nPK\n"\
+           ">Input_3_Lys-C_8_2_243.30608_10.04\nPK\n"\
+           ">Input_0_Lys-N_1_1_115.13198_5.97\nP\n"\
+           ">Input_1_Lys-N_3_2_243.30608_10.04\nKP\n"\
+           ">Input_2_Lys-N_5_2_243.30608_10.04\nKP\n"\
+           ">Input_3_Lys-N_7_2_243.30608_10.04\nKP\n"\
+           ">Input_4_Lys-N_8_1_146.18938_10.04\nK\n" in captured.out
+
+    # stryer
+    with unittest.mock.patch("sys.argv", ["func_test",
+                                          "-s", "PKPKPKPK",
+                                          "-e", "28", "29", "-p", "stryer"]):
+        RapidPeptidesGenerator.main()
+    # Output
+    captured = capsys.readouterr()
+    assert ">Input_0_Lys-C_2_2_243.30608_9.4\nPK\n"\
+           ">Input_1_Lys-C_4_2_243.30608_9.4\nPK\n"\
+           ">Input_2_Lys-C_6_2_243.30608_9.4\nPK\n"\
+           ">Input_3_Lys-C_8_2_243.30608_9.4\nPK\n"\
+           ">Input_0_Lys-N_1_1_115.13198_5.54\nP\n"\
+           ">Input_1_Lys-N_3_2_243.30608_9.4\nKP\n"\
+           ">Input_2_Lys-N_5_2_243.30608_9.4\nKP\n"\
+           ">Input_3_Lys-N_7_2_243.30608_9.4\nKP\n"\
+           ">Input_4_Lys-N_8_1_146.18938_9.4\nK\n" in captured.out
+
+def test_f_option(capsys):
+    """ Test -f behavior """
+    # default
+    with unittest.mock.patch("sys.argv", ["func_test",
+                                          "-s", "PKPKPKPK",
+                                          "-e", "28", "29", "-f", "fasta"]):
+        RapidPeptidesGenerator.main()
+    # Output
+    captured = capsys.readouterr()
+    assert "Input_0_Lys-C_2_2_243.30608_10.04\nPK\n"\
+           ">Input_1_Lys-C_4_2_243.30608_10.04\nPK\n"\
+           ">Input_2_Lys-C_6_2_243.30608_10.04\nPK\n"\
+           ">Input_3_Lys-C_8_2_243.30608_10.04\nPK\n"\
+           ">Input_0_Lys-N_1_1_115.13198_5.97\nP\n"\
+           ">Input_1_Lys-N_3_2_243.30608_10.04\nKP\n"\
+           ">Input_2_Lys-N_5_2_243.30608_10.04\nKP\n"\
+           ">Input_3_Lys-N_7_2_243.30608_10.04\nKP\n"\
+           ">Input_4_Lys-N_8_1_146.18938_10.04\nK\n" in captured.out
+
+    # csv
+    with unittest.mock.patch("sys.argv", ["func_test",
+                                          "-s", "PKPKPKPK",
+                                          "-e", "28", "29", "-f", "csv"]):
+        RapidPeptidesGenerator.main()
+    # Output
+    captured = capsys.readouterr()
+    assert "Original_header,No_peptide,Enzyme,Cleaving_pos,Peptide_size,"\
+           "Peptide_mass,pI,Sequence\n"\
+           "Input,0,Lys-C,2,2,243.30608,10.04,PK\n"\
+           "Input,1,Lys-C,4,2,243.30608,10.04,PK\n"\
+           "Input,2,Lys-C,6,2,243.30608,10.04,PK\n"\
+           "Input,3,Lys-C,8,2,243.30608,10.04,PK\n"\
+           "Input,0,Lys-N,1,1,115.13198,5.97,P\n"\
+           "Input,1,Lys-N,3,2,243.30608,10.04,KP\n"\
+           "Input,2,Lys-N,5,2,243.30608,10.04,KP\n"\
+           "Input,3,Lys-N,7,2,243.30608,10.04,KP\n"\
+           "Input,4,Lys-N,8,1,146.18938,10.04,K\n" in captured.out
+
+    # tsv
+    with unittest.mock.patch("sys.argv", ["func_test",
+                                          "-s", "PKPKPKPK",
+                                          "-e", "28", "29", "-f", "tsv"]):
+        RapidPeptidesGenerator.main()
+    # Output
+    captured = capsys.readouterr()
+    assert "Original_header\tNo_peptide\tEnzyme\tCleaving_pos\tPeptide_size\t"\
+           "Peptide_mass\tpI\tSequence\n"\
+           "Input\t0\tLys-C\t2\t2\t243.30608\t10.04\tPK\n"\
+           "Input\t1\tLys-C\t4\t2\t243.30608\t10.04\tPK\n"\
+           "Input\t2\tLys-C\t6\t2\t243.30608\t10.04\tPK\n"\
+           "Input\t3\tLys-C\t8\t2\t243.30608\t10.04\tPK\n"\
+           "Input\t0\tLys-N\t1\t1\t115.13198\t5.97\tP\n"\
+           "Input\t1\tLys-N\t3\t2\t243.30608\t10.04\tKP\n"\
+           "Input\t2\tLys-N\t5\t2\t243.30608\t10.04\tKP\n"\
+           "Input\t3\tLys-N\t7\t2\t243.30608\t10.04\tKP\n"\
+           "Input\t4\tLys-N\t8\t1\t146.18938\t10.04\tK\n" in captured.out
+
+def test_i_option(capsys, truth, file_a):
+    """ Test the functional behavior of FRAG of i option """
+    # Test -i behavior with fasta file
+    with unittest.mock.patch("sys.argv", ["func_test",
+                                          "-i", str(file_a),
+                                          "-e", "42"]):
+        RapidPeptidesGenerator.main()
+    # Output
+    captured = capsys.readouterr()
+    # Check result
+    for i in truth:
+        assert i in captured.out
+
+def test_i_option_parallel(capsys, truth, file_a):
+    """ Test the functional behavior of FRAG of i option """
+    # Test -i behavior with fasta file
+    with unittest.mock.patch("sys.argv", ["func_test",
+                                          "-i", str(file_a),
+                                          "-e", "42",
+                                          "-c", "8"]):
+        RapidPeptidesGenerator.main()
+    # Output
+    captured = capsys.readouterr()
+    # Check result
+    for i in truth:
+        assert i in captured.out
+
+def test_o_option(tmpdir, truth, file_a):
+    """ Test the functional behavior of FRAG of o (and q) option """
+    # Output folder
+    output_folder = tmpdir.mkdir("res_functional_tests")
+
+    # Test -o behavior with fasta file
+    with unittest.mock.patch("sys.argv", ["func_test",
+                                          "-i", str(file_a),
+                                          "-e", "42",
+                                          "-q",
+                                          "-o", os.path.join(output_folder,
+                                                             "res.fa")]):
+        RapidPeptidesGenerator.main()
+    # Check result
+    nb_line = 0
+    with open(os.path.join(output_folder, "res.fa")) as file_res:
+        for line in file_res:
+            nb_line += 1
+            assert line in truth
+    assert nb_line == len(truth)
+
+def test_no_enz(capsys, monkeypatch, list_enz, res_dig_1_42):
+    """ Test -l behavior """
+    responses = iter(["1 42", ""])
+    with unittest.mock.patch("sys.argv", ["func_test",
+                                          "-s", "DREALDSSWKKLRSgagGRKNAGI"\
+                                                "RLVLWMLDFDAHQPDSVLQREFL"]):
+        monkeypatch.setattr('builtins.input', lambda msg: next(responses))
+        RapidPeptidesGenerator.main()
+    # Output
+    captured = capsys.readouterr()
+    assert list_enz in captured.out
+    assert res_dig_1_42 in captured.out
+
+def test_no_enz_quit(capsys, monkeypatch, list_enz):
+    """ Test -l behavior """
+    responses = iter(["q"])
+    with pytest.raises(SystemExit) as pytest_wrapped_e:
+        with unittest.mock.patch("sys.argv", ["func_test",
+                                              "-s", "DREALDSSWKKLRSgagGRKNAGI"\
+                                                    "RLVLWMLDFDAHQPDSVLQREF"\
+                                                    "L"]):
+            monkeypatch.setattr('builtins.input', lambda msg: next(responses))
+            RapidPeptidesGenerator.main()
+    assert pytest_wrapped_e.value.code == 0
+    captured = capsys.readouterr()
+    assert list_enz in captured.out
+
+def test_no_enz_err(capsys, monkeypatch, list_enz, res_dig_1_42):
+    """ Test -l behavior """
+    responses = iter(["1 42 b", ""])
+    with unittest.mock.patch("sys.argv", ["func_test",
+                                          "-s", "DREALDSSWKKLRSgagGRKNAGI"\
+                                                "RLVLWMLDFDAHQPDSVLQREFL"]):
+        monkeypatch.setattr('builtins.input', lambda msg: next(responses))
+        RapidPeptidesGenerator.main()
+    # Output
+    captured = capsys.readouterr()
+    assert list_enz in captured.out
+    assert res_dig_1_42 in captured.out
+    assert "Warning: 'b' should be an integer value. This values will be "\
+           "ignored.\n" in captured.err