{
  "assessmentTests": {
    "javascript_test": {
      "name": "Qormaata JavaScript",
      "desc": "Gaaffiiwwan haala adda addaa 30 kanneen syntax fi coercion bu'uuraa, faankishiniiwwan/daangaa/cufamoo fi this, oobijeektota/arraayota fi caasaa daataa, akkasumas event loop/async/prototype idioms irratti xiyyeeffatan — beekumsi keessan kan JavaScript ibsa hojii tokko keessatti barbaadamuun walsimaa fi dhiisuu isaa mirkaneeffadhaa.",
      "recommendation": "Ibsa dandeettii JavaScript keessanii",
      "results": {
        "beginner": {
          "name": "Kan Jalqabaa",
          "desc": "Hojiiwwan hojjetanii fi wantoota hojjechuu dandeessu, garuu gaaffiiwwan isin dogoggortan caasaa jechaa irratti osoo hin taane, dirqisiisa gosaa fi hiika wabiitiin walqabatanii jiru — == osoo wal hin madaalin dura gosa jijjiiruun, ramaddii tartiiba wanta tokko waraabuu mannaa qoodu, maaliif NaN gonkumaa ofiin wal hin qixxaatu. Kun kamiyyuu JavaScript irratti gadhee ta'uu keessan kan agarsiisu miti; kun seera addaa namoota afaan kana baratan koodii hojjetu barreessuun baratan, gatiiwwanii fi wabiiwwan akkamitti akka hojjetan barachuu mannaa, isaan kuffisudha. Hojii irratti barbaachisoo dha, sababni isaas tokkoon tokkoon isaanii iddoo koodiin dogoggora malee hojjetee garuu waan dogoggoraa hojjetudha.",
          "recommendation": "Wantoota sadiin jalqabaa, tartiiba kanaan: maaliif == osoo wal hin madaalin dura gosa dirqisiisa, === garuu hin dirqisiisu, maaliif tartiiba yookiin wanta tokko gara jijjiirama haaraatti ramaduun gatii isaa waraabuu mannaa wabii isaa waraaba, fi akkamitti var ol kaafamee gara undefined tti jalqabsiifama, let fi const ammoo hanga ibsi isaanii hojjetutti naannoo du'aa yeroo keessa turu. Qajeelchi JavaScript kan MDN sadanuu fakkeenyota hojjetamuu danda'an waliin ibsa."
        },
        "intermediate": {
          "name": "Giddu-galeessa",
          "desc": "Koodiiwwan ijaarsa guyyaa guyyaa haala salphaan ni qabattu — hojiiwwan, tooftaawwan tartiiba, tooftaa too'annoo ifa ta'e — fi hojii amala idilee irratti hin suudoftan. Garaagarummaan asii fi Gara Gaggeessaa gidduu jiru yeroo baayyee waan yeroo seerri daangaa fi yeroo JavaScript wal-qunnaman ta'udha: var tokko marsaa keessatti qabamee deebii waamichaa hunda keessatti gatii dhumaa walfakkaataa dubbisu, this tokko yeroo tooftaan irraa adda ba'u callisee wanta sana agarsiisuu dhaabuu, waraabbii faca'insaa gadi fageenyaan mul'atu garuu sadarkaa tokko qofa waraabuu. Kunniin gosa dogoggora dubbisa saffisaa darbee haala yeroo hojii addaa jalatti qofa mul'atudha.",
          "recommendation": "Daangaa fi this akkamitti yeroo waamichaa irratti furmaata argatan irratti xiyyeeffadhaa, yeroo ibsaatti osoo hin taane: maaliif marsaan for var irratti hundaa'e deebii waamichaa hundaaf gatii lakkoofsa dhumaa walfakkaataa kenna, let garuu hin kennu, akkamitti this bakka itti barreeffame osoo hin taane akkamitti hojiin tokko waamameen murtaa'a, fi maaliif faca'insi yookiin Object.assign sadarkaa olii wanta tokkoo qofa waraaba. Sana booda marsaa taatee, sababni isaas kun namoota duruu waadaa dhuunfaan beekan kuffisa."
        },
        "advanced": {
          "name": "Guddaa",
          "desc": "Kun sadarkaa beeksisa hojii baay'een “JavaScript cimaa” jechuun hiika kennaniifidha. Tartiiba filter/map/reduce dubbistanii tartiiba jalqabaa osoo hin jijjiirin sirriitti waan inni deebisu tilmaamuu dandeessu, maaliif console.log walfaanotaa yeroo hunda hojii xiqqaa caala, innis yeroo hunda setTimeout caala beektu, fi Promise.all ni fayyadamtu sababni isaas yeroo waadaan tokko kufutti dafee akka kufu beektu, kanneen hafan eeguu mannaa. Garaagarummaan garee kanaa fi isa olii gidduu jiru gama pirotootaayipii fi moodeela wantaati: akkamitti tartiibni pirotootaayipii tooftaa dhaalaa furmaata argata hasOwnProperty wajjin wal bira qabamee, fi maaliif dirreen dhuunfaa kilaasii dhugumaan dhoksa.",
          "recommendation": "Kutaa haala koodiiwwan biroon tuqan eeganitti ce'aa: akkamitti tartiibni pirotootaayipii JavaScript barbaacha tooftaa kan ofii isaatii irratti hin jirre furmaata argata, maaliif dirreen dhuunfaa #fields kilaasii dhugumaan irraa dhoksa, fi akkamitti JSON.stringify undefined fi hojiiwwan wanta salphaa keessatti fi tartiiba keessatti adda addummaan ilaala. Barreeffamni MDN marsaa taatee fi tartiiba pirotootaayipii irratti jiru lamaanuuf itti aansuudha."
        },
        "expert": {
          "name": "Ogeessa",
          "desc": "Kutaa hunda keessatti sadarkaa olaanaa galmeessitaniittu — caasaa jechaa bu'uuraa, gosaa fi dirqisiisa; hojiiwwan, daangaa, cufamoo fi this; wantoota, tartiiba fi caasaa daataa; fi async, marsaa taatee, pirotootaayipii fi jechamoota. Qabatamaatti, kun jechuun hojii nama hin beeknee isiniif kennamee maaliif waan deebisu akka deebisu ibsuu dandeessu, caasaan jechaa maal gochuu qaba jedhu qofa osoo hin taane, kunis dandeettii cimaa fi gatii guddaa qabudha. Sadarkaa kanatti afaanichi mataan isaa yeroo baayyee daangaa miti; daangaan yeroo baayyee too'annoo yaa'a async yookiin boca daataa isa jala jiruti.",
          "recommendation": "Bu'aan amma dizaayinii fi adda baasuu keessa jira: hiika isaanii irra deddeebi'uu mannaa haala dorgommii Promise.all fi Promise.race gidduu jiru irratti yaaduu, yoom cufamoon meeshaa sirrii haala dhuunfaatiif ta'a yookiin yoom dirreen dhuunfaa kilaasii ta'a filachuu, fi dogoggora tartiiba hojii xiqqaa fi hojii guddaa gidduu jiru galmee oomishaa keessatti dubbisuu, qormaata keessatti osoo hin taane. Yoo ga'ee hojiitiif qoratamaa jiraattan, dogoggora yeroo argattan ibsaa — jijjiirama cufamoo moofa'e yookiin deebii waamichaa async tartiiba malee dhufe — amala JavaScript maqaa dhahuu mannaa; kun yaada agarsiisa, jechoota qofa miti."
        }
      },
      "questions": [
        {
          "question": "console.log(x);\nvar x = 5;\nKun maal maxxansa?",
          "options": [
            {
              "icon": "",
              "label": "5"
            },
            {
              "icon": "",
              "label": "ReferenceError: x hin ibsamne"
            },
            {
              "icon": "",
              "label": "undefined"
            },
            {
              "icon": "",
              "label": "null"
            }
          ]
        },
        {
          "question": "console.log(y);\nlet y = 5;\nMaaltu ta'a?",
          "options": [
            {
              "icon": "",
              "label": "ReferenceError darba"
            },
            {
              "icon": "",
              "label": "Undefined maxxansa"
            },
            {
              "icon": "",
              "label": "5 maxxansa"
            },
            {
              "icon": "",
              "label": "SyntaxError darba"
            }
          ]
        },
        {
          "question": "const arr = [1, 2, 3];\narr.push(4);\nconsole.log(arr.length);\nKun maal maxxansa?",
          "options": [
            {
              "icon": "",
              "label": "4"
            },
            {
              "icon": "",
              "label": "TypeError darba"
            },
            {
              "icon": "",
              "label": "3"
            },
            {
              "icon": "",
              "label": "undefined"
            }
          ]
        },
        {
          "question": "console.log('' == 0);\nconsole.log('' === 0);\nSararoonni lamaan maal maxxansu?",
          "options": [
            {
              "icon": "",
              "label": "dhugaa sana booda dhugaa"
            },
            {
              "icon": "",
              "label": "soba sana booda soba"
            },
            {
              "icon": "",
              "label": "dhugaa sana booda soba"
            },
            {
              "icon": "",
              "label": "TypeError darba"
            }
          ]
        },
        {
          "question": "console.log(NaN === NaN);\nconsole.log(Number.isNaN(NaN));\nSararoonni lamaan maal maxxansu?",
          "options": [
            {
              "icon": "",
              "label": "dhugaa sana booda dhugaa"
            },
            {
              "icon": "",
              "label": "TypeError darba"
            },
            {
              "icon": "",
              "label": "soba sana booda soba"
            },
            {
              "icon": "",
              "label": "soba sana booda dhugaa"
            }
          ]
        },
        {
          "question": "console.log(typeof null);\nKun maal maxxansa?",
          "options": [
            {
              "icon": "",
              "label": "\"null\""
            },
            {
              "icon": "",
              "label": "\"object\""
            },
            {
              "icon": "",
              "label": "\"undefined\""
            },
            {
              "icon": "",
              "label": "\"boolean\""
            }
          ]
        },
        {
          "question": "Kan armaan gadii keessaa kamtu yeroo uunka if keessatti fayyadaman dhugaa ta'a?",
          "options": [
            {
              "icon": "",
              "label": "0"
            },
            {
              "icon": "",
              "label": "\"\" (jecha duwwaa)"
            },
            {
              "icon": "",
              "label": "null"
            },
            {
              "icon": "",
              "label": "\"0\" (jecha zeeroo)"
            }
          ]
        },
        {
          "question": "foo();\nfunction foo() { console.log('a'); }\nbar();\nvar bar = function() { console.log('b'); };\nMaaltu ta'a?",
          "options": [
            {
              "icon": "",
              "label": "Waamichi lamaanuu ni maxxansa: “a” sana booda “b”"
            },
            {
              "icon": "",
              "label": "foo() “a” maxxansa; bar() TypeError darba"
            },
            {
              "icon": "",
              "label": "foo() fi bar() lamaanuu ReferenceError darbu"
            },
            {
              "icon": "",
              "label": "foo() ReferenceError darba; bar() “b” maxxansa"
            }
          ]
        },
        {
          "question": "function makeCounter() {\n  let count = 0;\n  return function() { count++; return count; };\n}\nconst counter = makeCounter();\nconsole.log(counter());\nconsole.log(counter());\nSararoonni lamaan maal maxxansu?",
          "options": [
            {
              "icon": "",
              "label": "1 sana booda 1"
            },
            {
              "icon": "",
              "label": "NaN sana booda NaN"
            },
            {
              "icon": "",
              "label": "undefined sana booda undefined"
            },
            {
              "icon": "",
              "label": "1 sana booda 2"
            }
          ]
        },
        {
          "question": "for (var i = 0; i < 3; i++) {\n  setTimeout(() => console.log(i), 0);\n}\nKun maal maxxansa?",
          "options": [
            {
              "icon": "",
              "label": "0, 1, 2"
            },
            {
              "icon": "",
              "label": "3, 3, 3"
            },
            {
              "icon": "",
              "label": "ReferenceError darba"
            },
            {
              "icon": "",
              "label": "undefined, undefined, undefined"
            }
          ]
        },
        {
          "question": "for (let i = 0; i < 3; i++) {\n  setTimeout(() => console.log(i), 0);\n}\nKun maal maxxansa?",
          "options": [
            {
              "icon": "",
              "label": "3, 3, 3"
            },
            {
              "icon": "",
              "label": "ReferenceError darba"
            },
            {
              "icon": "",
              "label": "undefined, undefined, undefined"
            },
            {
              "icon": "",
              "label": "0, 1, 2"
            }
          ]
        },
        {
          "question": "function greet() { return `Hi, ${this.name}`; }\nconst person = { name: 'Ana' };\nconsole.log(greet.call(person));\nKun maal maxxansa?",
          "options": [
            {
              "icon": "",
              "label": "“Hi, Ana”"
            },
            {
              "icon": "",
              "label": "“Hi, undefined”"
            },
            {
              "icon": "",
              "label": "TypeError darba"
            },
            {
              "icon": "",
              "label": "“Hi, ${this.name}”"
            }
          ]
        },
        {
          "question": "const timer = {\n  seconds: 0,\n  start: function() {\n    setInterval(() => { this.seconds++; }, 1000);\n  },\n};\nNamoonni maaliif hojii xiyyaa function() { this.seconds++ } caalaa setInterval keessatti filatu?",
          "options": [
            {
              "icon": "",
              "label": "Hojiiwwan xiyyaa this kan start fayyadamu, innis timer dha"
            },
            {
              "icon": "",
              "label": "Faankishinoonni Arrow (Arrow functions) faankishinoota idilee caalaa saffisaan hojjetu"
            },
            {
              "icon": "",
              "label": "Faankishinoonni Arrow (Arrow functions) 'this' gara oobijeektii addunyaalessaa (global object) tti hidhu"
            },
            {
              "icon": "",
              "label": "Faankishinoonni Arrow (Arrow functions) 'this' gara jijjiiramaa addunyaalessaa (global variable) tti jijjiiru"
            }
          ]
        },
        {
          "question": "function multiply(a, b) { return a * b; }\nconst double = multiply.bind(null, 2);\nconsole.log(double(5));\nKun maal maxxansa?",
          "options": [
            {
              "icon": "",
              "label": "5"
            },
            {
              "icon": "",
              "label": "10"
            },
            {
              "icon": "",
              "label": "NaN"
            },
            {
              "icon": "",
              "label": "7"
            }
          ]
        },
        {
          "question": "function outer() {\n  let x = 10;\n  function inner() {\n    let x = 20;\n    console.log(x);\n  }\n  inner();\n  console.log(x);\n}\nouter();\nWaamichi console.log lamaanuu maal maxxansu?",
          "options": [
            {
              "icon": "",
              "label": "20 achiis 20"
            },
            {
              "icon": "",
              "label": "20 achiis 10"
            },
            {
              "icon": "",
              "label": "10 achiis 10"
            },
            {
              "icon": "",
              "label": "SyntaxError darba"
            }
          ]
        },
        {
          "question": "const a = [1, 2, 3];\nconst b = a;\nb.push(4);\nconsole.log(a.length);\nKun maal maxxansa?",
          "options": [
            {
              "icon": "",
              "label": "3"
            },
            {
              "icon": "",
              "label": "undefined"
            },
            {
              "icon": "",
              "label": "TypeError darba"
            },
            {
              "icon": "",
              "label": "4"
            }
          ]
        },
        {
          "question": "const original = { name: 'Ana', tags: ['x', 'y'] };\nconst copy = { ...original };\ncopy.name = 'Bea';\ncopy.tags.push('z');\nconsole.log(original.name, original.tags.length);\nKun maal maxxansa?",
          "options": [
            {
              "icon": "",
              "label": "'Ana' 2"
            },
            {
              "icon": "",
              "label": "'Ana' 3"
            },
            {
              "icon": "",
              "label": "'Bea' 3"
            },
            {
              "icon": "",
              "label": "'Bea' 2"
            }
          ]
        },
        {
          "question": "const { a: x = 10, b: y = 20 } = { a: 5 };\nconsole.log(x, y);\nKun maal maxxansa?",
          "options": [
            {
              "icon": "",
              "label": "undefined undefined"
            },
            {
              "icon": "",
              "label": "5 undefined"
            },
            {
              "icon": "",
              "label": "10 20"
            },
            {
              "icon": "",
              "label": "5 20"
            }
          ]
        },
        {
          "question": "const [first, ...rest] = [1, 2, 3, 4];\nconsole.log(rest);\nKun maal maxxansa?",
          "options": [
            {
              "icon": "",
              "label": "[1, 2, 3, 4]"
            },
            {
              "icon": "",
              "label": "[2, 3, 4]"
            },
            {
              "icon": "",
              "label": "2"
            },
            {
              "icon": "",
              "label": "[1]"
            }
          ]
        },
        {
          "question": "const nums = [10, 1, 2];\nnums.sort();\nconsole.log(nums);\nKun maal maxxansa?",
          "options": [
            {
              "icon": "",
              "label": "[1, 2, 10]"
            },
            {
              "icon": "",
              "label": "[10, 1, 2]"
            },
            {
              "icon": "",
              "label": "[1, 10, 2]"
            },
            {
              "icon": "",
              "label": "[2, 1, 10]"
            }
          ]
        },
        {
          "question": "const user = { profile: { age: 0 } };\nconsole.log(user.profile?.age ?? 'unknown');\nconsole.log(user.address?.city ?? 'unknown');\nSararoonni lamaan maal maxxansu?",
          "options": [
            {
              "icon": "",
              "label": "'unknown' achiis 'unknown'"
            },
            {
              "icon": "",
              "label": "0 achiis 'unknown'"
            },
            {
              "icon": "",
              "label": "0 achiis undefined"
            },
            {
              "icon": "",
              "label": "'unknown' achiis 0"
            }
          ]
        },
        {
          "question": "const obj = { a: undefined, b: function(){}, c: NaN, d: [undefined, function(){}, 1] };\nconsole.log(JSON.stringify(obj));\nKun maal maxxansa?",
          "options": [
            {
              "icon": "",
              "label": "'{\"a\":null,\"b\":null,\"c\":null,\"d\":[null,null,1]}'"
            },
            {
              "icon": "",
              "label": "'{\"c\":NaN,\"d\":[1]}'"
            },
            {
              "icon": "",
              "label": "'{\"c\":null,\"d\":[null,null,1]}'"
            },
            {
              "icon": "",
              "label": "TypeError darba"
            }
          ]
        },
        {
          "question": "console.log('1');\nsetTimeout(() => console.log('2'), 0);\nPromise.resolve().then(() => console.log('3'));\nconsole.log('4');\nKunniin tartiiba kamiin maxxanfamu?",
          "options": [
            {
              "icon": "",
              "label": "1, 2, 3, 4"
            },
            {
              "icon": "",
              "label": "1, 4, 2, 3"
            },
            {
              "icon": "",
              "label": "1, 4, 3, 2"
            },
            {
              "icon": "",
              "label": "1, 3, 4, 2"
            }
          ]
        },
        {
          "question": "async function foo() {\n  console.log('a');\n  await null;\n  console.log('b');\n}\nconsole.log('start');\nfoo();\nconsole.log('end');\nKunniin tartiiba kamiin maxxanfamu?",
          "options": [
            {
              "icon": "",
              "label": "start, a, end, b"
            },
            {
              "icon": "",
              "label": "start, a, b, end"
            },
            {
              "icon": "",
              "label": "start, end, a, b"
            },
            {
              "icon": "",
              "label": "a, start, end, b"
            }
          ]
        },
        {
          "question": "Promise.all([\n  Promise.resolve(1),\n  Promise.reject('err'),\n  Promise.resolve(3),\n]).then(r => console.log('ok', r)).catch(e => console.log('fail', e));\nKun maal maxxansa?",
          "options": [
            {
              "icon": "",
              "label": "'fail err'"
            },
            {
              "icon": "",
              "label": "'ok' [1, 3]"
            },
            {
              "icon": "",
              "label": "'ok' [1, undefined, 3]"
            },
            {
              "icon": "",
              "label": "Ni darba, qabataanis hin hojjetu"
            }
          ]
        },
        {
          "question": "const fast = new Promise(res => setTimeout(() => res('fast'), 10));\nconst slow = new Promise(res => setTimeout(() => res('slow'), 100));\nPromise.race([fast, slow]).then(v => console.log(v));\nKun maal maxxansa?",
          "options": [
            {
              "icon": "",
              "label": "'slow'"
            },
            {
              "icon": "",
              "label": "['fast', 'slow']"
            },
            {
              "icon": "",
              "label": "'fast'"
            },
            {
              "icon": "",
              "label": "TypeError darba"
            }
          ]
        },
        {
          "question": "function Animal(name) { this.name = name; }\nAnimal.prototype.speak = function() { return `${this.name} makes a sound`; };\nconst dog = new Animal('Rex');\nconsole.log(dog.speak());\nconsole.log(dog.hasOwnProperty('speak'));\nSararoonni lamaan maal maxxansu?",
          "options": [
            {
              "icon": "",
              "label": "'Rex makes a sound' achiis dhugaa"
            },
            {
              "icon": "",
              "label": "undefined achiis soba"
            },
            {
              "icon": "",
              "label": "TypeError darba"
            },
            {
              "icon": "",
              "label": "'Rex makes a sound' achiis soba"
            }
          ]
        },
        {
          "question": "class Counter {\n  #count = 0;\n  increment() { this.#count++; return this.#count; }\n}\nconst c = new Counter();\nconsole.log(c.increment());\nconsole.log(c.count);\nSararoonni lamaan maal maxxansu?",
          "options": [
            {
              "icon": "",
              "label": "1 achiis undefined"
            },
            {
              "icon": "",
              "label": "1 achiis 0"
            },
            {
              "icon": "",
              "label": "1 sana booda 1"
            },
            {
              "icon": "",
              "label": "SyntaxError darba"
            }
          ]
        },
        {
          "question": "const items = ['a', 'b'];\nconst label = `Items: ${items.length > 0 ? items.join(', ') : 'none'}`;\nconsole.log(label);\nKun maal maxxansa?",
          "options": [
            {
              "icon": "",
              "label": "'Items: ${items.length > 0 ? items.join(\\', \\') : \\'none\\'}'"
            },
            {
              "icon": "",
              "label": "'Items: none'"
            },
            {
              "icon": "",
              "label": "'Items: a, b'"
            },
            {
              "icon": "",
              "label": "SyntaxError darba"
            }
          ]
        },
        {
          "question": "const nums = [1, 2, 3, 4, 5];\nconst result = nums.filter(n => n % 2 === 0).map(n => n * 10).reduce((sum, n) => sum + n, 0);\nconsole.log(result, nums);\nKun maal maxxansa?",
          "options": [
            {
              "icon": "",
              "label": "60 [1, 2, 3, 4, 5]"
            },
            {
              "icon": "",
              "label": "60 [2, 4, 20, 40]"
            },
            {
              "icon": "",
              "label": "150 [1, 2, 3, 4, 5]"
            },
            {
              "icon": "",
              "label": "60 [20, 40]"
            }
          ]
        }
      ],
      "optionOrderVersion": "7335aa056fc9d33a"
    }
  },
  "testNames": {
    "javascript-test": "Qormaata JavaScript"
  }
}
