اكتب محاكي روبوت.
يحتاج مرفق اختبار في مصنع للروبوتات إلى برنامج للتحقق من حركات الروبوت.
للروبوتات ثلاث حركات ممكنة:
توضع الروبوتات على شبكة افتراضية لا نهائية، وهي متجهة نحو اتجاه معين (الشمال أو الشرق أو الجنوب أو الغرب) عند مجموعة من الإحداثيات {x,y}، مثل {3,8}، حيث تزداد الإحداثيات نحو الشمال والشرق.
ثم يتلقى الروبوت عددًا من التعليمات، وعندها يتحقق مرفق الاختبار من موضع الروبوت الجديد، ومن الاتجاه الذي يشير إليه.
الاختبارات مقسّمة إلى 3 خطوات.
شغّل جميع الاختبارات باستخدام go test، أو شغّل اختبارات محدّدة باستخدام الخيار -tags.
أمثلة:
go test # run all tests
go test -tags step1 # run just step 1 tests.
go test -tags 'step1 step2' # run step1 and step2 tests
لديك ملف المصدر defs.go، وهو يعرّف عددًا من الأشياء التي يحتاجها برنامج الاختبار.
وهو منظّم في ثلاثة أقسام حسب الخطوة.
لإكمال الخطوة 1 ستعرّف Right وLeft وAdvance وN وS وE وW وDir.
أكمل الخطوة 1 قبل الانتقال إلى الخطوة 2.
في الخطوة 1 نفّذت حركات الروبوت، لكنها ليست محاكاة بالمعنى الكامل. على سبيل المثال، أين "الروبوت" في الكود المصدري؟ وأين "الشبكة"؟ وأين الحسابات التي تحوّل أفعال الروبوت إلى مواضع على الشبكة: في الروبوت أم في الشبكة؟ العالم المادي مختلف.
تقدّم الخطوة 2 مفهوم "الغرفة".
قد يبدو ذلك إضافة صغيرة، لكننا سنُجري تغييرات كبيرة لتوضيح أدوار "الغرفة" و"الروبوت" و"برنامج الاختبار"، ولنبدأ في توضيح فيزياء المحاكاة.
ستعرّف Room وRobot كدالتين يجعلهما برنامج الاختبار موجودتين بإطلاقهما بوصفهما goroutine.
وتنتقل المعلومات بين برنامج الاختبار والروبوت والغرفة عبر قنوات Go.
فكّر في Room كمحرّك فيزيائي، أي شيء يمثّل غرفة مادية بجدران وروبوت ويحاكيها.
وينبغي أن يمثّل بطريقة ما الفضاء الإحداثي للغرفة، وموقع الروبوت والجدران، وأن يضمن مثلًا ألّا يمرّ الروبوت عبر الجدران.
نريد أن يكون Robot وكيلًا ينفّذ الأفعال، لكننا نريد أن يحافظ Room على حقيقة متماسكة.
ينشئ برنامج الاختبار القنوات ويشغّل كلا من Room وRobot.
ثم يرسل برنامج الاختبار أوامر إلى Robot.
وعندما ينتهي من إرسال الأوامر، يغلق قناة الأوامر.
يجب أن يستقبل Robot الأوامر ويُبلغ Room بالأفعال التي يحاول القيام بها.
وعندما يستشعر إغلاق قناة الأوامر، يجب أن يوقف نفسه.
ويجب أن تفسّر الغرفة النتائج الفيزيائية لأفعال الروبوت.
وعندما تستشعر توقّف الروبوت، فإنها ترسل تقريرًا نهائيًا إلى برنامج الاختبار يبيّن الموضع النهائي للروبوت واتجاهه.
تتضمّن الخطوة 3 ثلاثة تغييرات رئيسية:
بالنسبة لتقرير الموضع النهائي المُرسل من Room3، يمكنك إرجاع الشريحة نفسها المستلمة من قناة الروبوتات، مع مواضع واتجاهات محدَّثة فقط.
ويجب إرسال رسائل على قناة السجلّ في الحالات التالية:
سجّل في Exercism لتتعلّم وتتقن Go عبر 34 مفهومًا165 تمرينًا، وإرشاد بشري حقيقي، وكل ذلك مجانًا.