2017-03-23 45 views
0

我有一個pyclips/clips程序,我使用pytest編寫了一些單元測試。 每個測試用例都會調用初始的clips.Clear(),然後通過clips.Load(rule_file.clp)執行實際剪輯COOL代碼。單獨運行每個測試都能正常運行CLIPS(清除)命令失敗/拋出pyclips異常

然而,當告訴pytest運行所有測試時,一些失敗,ClipsError: S03: environment could not be cleared。實際上,它取決於.py文件中測試的順序。似乎有些測試用例會導致後續的測試用例拋出異常。

也許有些剪輯代碼仍在「使用中」,以便清除失敗? 我讀here(clear)

清除剪輯。從CLIPS環境中移除所有結構和所有關聯的數據結構(例如事實和實例)。清晰可以在任何時候安全地執行,但是,某些構造不會在使用時被刪除。

這可能是這種情況嗎?什麼導致(clear)命令失敗?

編輯:

我能夠縮小問題。它發生在下列情況下:

test_case_A來自test_case_B之前。 在test_case_A有一個如

(test (eq (type ?f_bio_puts) clips_FUNCTION)) 

f_bio_putstest已被設置爲

(slot f_bio_puts (default [nil]))

所以測試一個時隙的變量,它已被設置爲[nil]最初的類型,似乎導致(clear)命令失敗。有任何想法嗎?

EDIT 2

我想我知道是什麼原因造成的問題。這是test線。我調整了我的代碼,使其在剪輯對話窗口中運行。我通過(batch ...)

[INSFUN2] No such instance nil in function type. 
[DRIVE1] This error occurred in the join network 
    Problem resided in associated join 
     Of pattern #1 in rule part_1 

加載時,我想這是pyclips的一個錯誤,這是掩蓋了這個錯誤。

回答

1

更改EnvClear功能片段中的源代碼文件construct.c加入以下代碼行重置錯誤標誌:

globle void EnvClear(
    void *theEnv) 
    { 
    struct callFunctionItem *theFunction; 

    /*==============================*/ 
    /* Clear error flags if issued */ 
    /* from an embedded controller. */ 
    /*==============================*/ 

    if ((EvaluationData(theEnv)->CurrentEvaluationDepth == 0) && 
     (! CommandLineData(theEnv)->EvaluatingTopLevelCommand) && 
     (EvaluationData(theEnv)->CurrentExpression == NULL)) 
    { 
     SetEvaluationError(theEnv,FALSE); 
     SetHaltExecution(theEnv,FALSE); 
    } 
+0

感謝您尋找到這加里。你的回答是否意味着剪輯中存在一個錯誤?它會在即將發佈的版本中更改嗎?或者是這樣的設計? – stackoverflowwww

+1

這是一個錯誤。當您使用命令提示符交互式使用CLIPS時,錯誤標誌會在每個命令發出時自動重置。嵌入時,各個API調用必須重置錯誤標誌。這將在下一個版本中得到解決,但如果遇到與其他API調用有關的問題,則還可以通過重置錯誤標誌而無需額外的代碼來檢查嵌入式控制器,從而解決pyclips方面的問題。 –