2012-10-19 17 views
7

की सहायता से पारसी परीक्षण मैं एक पारसी पार्सर के लिए एक परीक्षण लिखना चाहता हूं।हास्केल - क्विक चेक

data Event = Event { keyEvent :: String } 
    deriving Show 

parseKey :: Parser Event 
parseKey = do 
      char '<' 
      k <- many1 (letter <|> digit <|> oneOf "_") 
      char '>' 
      return $ Event k 

मैं जानता हूँ कि मैं parse = parse . pretty . parse संपत्ति की जांच करने की जरूरत है कि: यहाँ पार्सर और डेटा संरचना का उदाहरण है। लेकिन मुझे सही और गलत परीक्षण मामलों को कैसे उत्पन्न करना चाहिए? आम तौर पर, मुझे BNF दिए गए परीक्षण मामलों को कैसे उत्पन्न करना चाहिए? मुझे instance Arbitrary के बारे में पता है, लेकिन इससे बहुत मदद नहीं है।

यदि आप इस सरल पार्सर के लिए जनरेटर का एक अच्छी तरह से टिप्पणी उदाहरण प्रदान करते हैं तो मैं सराहना करता हूं।

+2

सही परीक्षण-मामलों के लिए 'id = parse की जांच होगी। सुंदर 'काफी अच्छा हो? (इसके अलावा, 'oneOf "_" == char' _'') – huon

+0

मुझे लगता है कि यह पर्याप्त होगा, हाँ! (इसके अलावा, पहला संस्करण कहीं अधिक अजीब था)। – m0nhawk

+2

@dbaupp: मैंने इसके बारे में सोचा है और नहीं, सरल उदाहरण पर विचार करें जब 'स्पेस' या पार्सर में अन्य छोड़ने योग्य पात्र होते हैं, तो परिणाम उत्पन्न अलग होगा। और अतिरिक्त 'पार्स' मदद करेगा। – m0nhawk

उत्तर

12

परीक्षण पार्सर्स पूरी तरह से तुच्छ नहीं है। (सभी परीक्षणों के साथ, चीज की जटिलता के आधार पर।)

एक चीज जो आप कर सकते हैं वह Arbitrary उदाहरण लिखना है जो सभी मान्य अभिव्यक्तियों (या जो कुछ भी आप पार्स करने का प्रयास कर रहे हैं) बनाते हैं, और फिर चेक करें कि यदि आप चीज को सुंदर प्रिंट करते हैं और फिर परिणामी स्ट्रिंग को पार्स करते हैं, तो आप ठीक उसी तरह वापस आते हैं जो आपने शुरू किया था।

  • अगर जवाब गलत है, क्या टूट गया है:

    उस के साथ समस्याओं की एक जोड़ी रहे हैं? पार्सर या प्रिंटर?

  • यदि आप जिस चीज को पार्सिंग कर रहे हैं वह वैकल्पिक ब्रैकेट और चीजों के लिए पर्याप्त जटिल है, तो आपको यह जांचना होगा कि वैकल्पिक ब्रैकेट के साथ और बिना दोनों काम करता है। आपका सुंदर प्रिंटर केवल एक ही रास्ता या दूसरे को ही करेगा।

  • यह जांच नहीं करता है कि कचरा इनपुट वास्तव में अस्वीकार कर दिया जाता है (और कुछ अजीब के रूप में पार्स नहीं किया जाता है)। उदाहरण के लिए, मैंने बहुत सारे पारसी पार्सर्स लिखे हैं जो इनपुट के अंत पर होने पर सिंटैक्स त्रुटि को चुपचाप अनदेखा कर देंगे।

सामान्य में, केवल सच पूरी तरह से तरह से मैं एक पार्सर परीक्षण के बारे में पता अभी बहुत सारे और हाथ से मैनुअल परीक्षण के बहुत सारे लिखने के लिए है। (और हर बार जब आपको कुछ गलत लगता है, तो इसके लिए एक और टेस्ट केस जोड़ें।) यह अनिवार्य रूप से जीएचसी उनके परीक्षण सूट के साथ करता है, उदाहरण के लिए।

बेशक, यह निर्भर करता है कि आपका पार्सर कितना जटिल है, और आप कितना आश्वासन चाहते हैं ... यदि आप बस JSON को पार्स कर रहे हैं, तो आप शायद इसे आसानी से जांच सकते हैं। यदि आप मार्कडाउन की तरह कुछ पार्स कर रहे हैं ... मेरे भगवान को आपकी आत्मा पर दया है!

+0

मैं [XCompose] (http://www.unix.com/man-page/all/5/XCompose/) के पार्सर को लिख रहा हूं, यदि दिलचस्पी है [यहां] (https://github.com/m0nhawk/ XComposeChecker) स्रोत हैं। तो, इसके लिए क्विक चेक बनाना होगा क्या यह समझ में आता है? या हाथ से लिखे गए परीक्षण बेहतर होंगे? और दूसरे मामले के लिए कौन सी लाइब्रेरी प्रस्तावित की जा सकती है? – m0nhawk

+0

आप निश्चित रूप से इन चीजों में से _both_ कर सकते हैं। एएसटी से स्ट्रिंग से एएसटी कार्यों तक राउंड-ट्रिप सत्यापित करने के लिए क्विक चेक का उपयोग करें, और किनारे के मामलों की जांच के लिए कुछ मैन्युअल परीक्षण लिखें।यह एक काफी छोटे व्याकरण की तरह दिखता है, इसलिए परीक्षण करने के लिए यह बहुत कठिन नहीं होना चाहिए ... – MathematicalOrchid

संबंधित मुद्दे