Commit eefc99556e26f71193eaa25892fad2f6137bcc56

  • Tree SHA1: 2ba238e
  • Parent SHA1: c5e2d29 (Lisätty testejä tapauksiin, jossa kaaviosta puuttuu ulostuloja ja/tai sisäänmenoja. Tuotetaan geneerinen virheviesti, luottaen että try-except lohkot nappaa kaikki virheet (tyhjiä taulukoita jne.))
  • raw diff | raw patch
Lisätty testit tapauksille jossa opiskelija laittaa ylimääräisiä kytkimiä tai LEDejä. Duplikaattikytkinten havaitsemiseksi muutettu terminals set:stä list:ksi. Jossain vaiheessa täytyy varmaan lisätä tarkistukset sille ettäopettajan syöttämissä 'oikeissa' ratkaisuissa ei ole syntaksi virheitä
koe6_dupKytkin.txt
(25 / 0)
  
1{
2 "devices":[
3 {"type":"DC","id":"dev0","x":56,"y":144,"label":"DC"},
4 {"type":"Toggle","id":"dev1","x":160,"y":72,"label":"a"},
5 {"type":"Toggle","id":"dev2","x":160,"y":144,"label":"sel"},
6 {"type":"LED","id":"dev3","x":576,"y":72,"label":"Keltainen","color":"#ffff00"},
7 {"type":"LED","id":"dev4","x":576,"y":144,"label":"Sininen","color":"#0000ff"},
8 {"type":"AND","id":"dev5","x":344,"y":40,"label":"AND"},
9 {"type":"NOT","id":"dev6","x":264,"y":192,"label":"NOT"},
10 {"type":"AND","id":"dev7","x":352,"y":160,"label":"AND"},
11 {"type":"Toggle","label":"a","id":"dev8","x":160,"y":224}
12 ],
13 "connectors":[
14 {"from":"dev1.in0","to":"dev0.out0"},
15 {"from":"dev2.in0","to":"dev0.out0"},
16 {"from":"dev3.in0","to":"dev7.out0"},
17 {"from":"dev4.in0","to":"dev5.out0"},
18 {"from":"dev5.in0","to":"dev1.out0"},
19 {"from":"dev5.in1","to":"dev2.out0"},
20 {"from":"dev6.in0","to":"dev8.out0"},
21 {"from":"dev7.in0","to":"dev1.out0"},
22 {"from":"dev7.in1","to":"dev6.out0"},
23 {"from":"dev8.in0","to":"dev0.out0"}
24 ]
25}
koe6_dupLED.txt
(25 / 0)
  
1{
2 "devices":[
3 {"type":"DC","id":"dev0","x":56,"y":144,"label":"DC"},
4 {"type":"Toggle","id":"dev1","x":160,"y":72,"label":"a"},
5 {"type":"Toggle","id":"dev2","x":160,"y":144,"label":"sel"},
6 {"type":"LED","id":"dev3","x":576,"y":72,"label":"Keltainen","color":"#ffff00"},
7 {"type":"LED","id":"dev4","x":576,"y":144,"label":"Sininen","color":"#0000ff"},
8 {"type":"AND","id":"dev5","x":344,"y":40,"label":"AND"},
9 {"type":"NOT","id":"dev6","x":264,"y":192,"label":"NOT"},
10 {"type":"AND","id":"dev7","x":352,"y":160,"label":"AND"},
11 {"type":"LED","label":"Keltainen","color":"#ffff00","id":"dev8","x":584,"y":224}
12 ],
13 "connectors":[
14 {"from":"dev1.in0","to":"dev0.out0"},
15 {"from":"dev2.in0","to":"dev0.out0"},
16 {"from":"dev3.in0","to":"dev7.out0"},
17 {"from":"dev4.in0","to":"dev5.out0"},
18 {"from":"dev5.in0","to":"dev1.out0"},
19 {"from":"dev5.in1","to":"dev2.out0"},
20 {"from":"dev6.in0","to":"dev2.out0"},
21 {"from":"dev7.in0","to":"dev1.out0"},
22 {"from":"dev7.in1","to":"dev6.out0"},
23 {"from":"dev8.in0","to":"dev1.out0"}
24 ]
25}
koe6_ylimKytkin.txt
(25 / 0)
  
1{
2 "devices":[
3 {"type":"DC","id":"dev0","x":56,"y":144,"label":"DC"},
4 {"type":"Toggle","id":"dev1","x":160,"y":72,"label":"a"},
5 {"type":"Toggle","id":"dev2","x":160,"y":144,"label":"sel"},
6 {"type":"LED","id":"dev3","x":576,"y":72,"label":"Keltainen","color":"#ffff00"},
7 {"type":"LED","id":"dev4","x":576,"y":144,"label":"Sininen","color":"#0000ff"},
8 {"type":"AND","id":"dev5","x":344,"y":40,"label":"AND"},
9 {"type":"NOT","id":"dev6","x":264,"y":192,"label":"NOT"},
10 {"type":"AND","id":"dev7","x":352,"y":160,"label":"AND"},
11 {"type":"Toggle","label":"b","id":"dev8","x":152,"y":224}
12 ],
13 "connectors":[
14 {"from":"dev1.in0","to":"dev0.out0"},
15 {"from":"dev2.in0","to":"dev0.out0"},
16 {"from":"dev3.in0","to":"dev7.out0"},
17 {"from":"dev4.in0","to":"dev5.out0"},
18 {"from":"dev5.in0","to":"dev1.out0"},
19 {"from":"dev5.in1","to":"dev2.out0"},
20 {"from":"dev6.in0","to":"dev8.out0"},
21 {"from":"dev7.in0","to":"dev1.out0"},
22 {"from":"dev7.in1","to":"dev6.out0"},
23 {"from":"dev8.in0","to":"dev0.out0"}
24 ]
25}
koe6_ylimLED.txt
(25 / 0)
  
1{
2 "devices":[
3 {"type":"DC","id":"dev0","x":56,"y":144,"label":"DC"},
4 {"type":"Toggle","id":"dev1","x":160,"y":72,"label":"a"},
5 {"type":"Toggle","id":"dev2","x":160,"y":144,"label":"sel"},
6 {"type":"LED","id":"dev3","x":576,"y":72,"label":"Keltainen","color":"#ffff00"},
7 {"type":"LED","id":"dev4","x":576,"y":144,"label":"Sininen","color":"#0000ff"},
8 {"type":"AND","id":"dev5","x":344,"y":40,"label":"AND"},
9 {"type":"NOT","id":"dev6","x":264,"y":192,"label":"NOT"},
10 {"type":"AND","id":"dev7","x":352,"y":160,"label":"AND"},
11 {"type":"LED","label":"Punainen","color":"#ffff00","id":"dev8","x":584,"y":224}
12 ],
13 "connectors":[
14 {"from":"dev1.in0","to":"dev0.out0"},
15 {"from":"dev2.in0","to":"dev0.out0"},
16 {"from":"dev3.in0","to":"dev7.out0"},
17 {"from":"dev4.in0","to":"dev5.out0"},
18 {"from":"dev5.in0","to":"dev1.out0"},
19 {"from":"dev5.in1","to":"dev2.out0"},
20 {"from":"dev6.in0","to":"dev2.out0"},
21 {"from":"dev7.in0","to":"dev1.out0"},
22 {"from":"dev7.in1","to":"dev6.out0"},
23 {"from":"dev8.in0","to":"dev1.out0"}
24 ]
25}
simcirtest.py
(27 / 17)
  
111111class Logik:
112112 # def __init__(self, data, reverse):
113113 def __init__(self, data):
114 self.terminals = set()
114 #self.terminals = set()
115 self.terminals = [] # use list to catch possible duplicate switches
115116 if data is not None:
116117 self.devices = {}
117118 self.ulostulot = []
122122 dev = Device(d)
123123 self.devices[dev.dev_id] = dev
124124 if dev.dev_type == 'Toggle': # lisää muita input tyyppejä
125 self.terminals.add(dev.label)
125 #self.terminals.add(dev.label)
126 self.terminals.append(dev.label)
126127 if dev.dev_type == 'LED': # verrataan tähän, onko kytketty
127128 self.ledit.append(dev.label)
128129
147147 # Taulun jokainen rivi sitten sovitetaan
148148 # simcirin dokusta (graafi) generoiduille
149149 # funktioille.
150 # print self.terminals
151150 terminals = sorted(self.terminals)
152151 # terminals = sorted(self.terminals, reverse=self.reverse)
153152 products = itertools.product((False, True), repeat=len(terminals))
188188 tulostettava += hd + ' ' + nimi + '\n'
189189 for locs in locss:
190190 arvo = eval(lauseke, globals(), locs)
191 #print hianosti(locs),arvo
192191 # sys.stdout.write(hianosti(locs, label_length)+' '+str(arvo)+'\n')
193192 tulostettava += hianosti(locs, label_length)+' '+str(arvo)+'\n'
194193
232232 for out in self.ulostulot:
233233 testlist.append(self.devices[out.from_id].label)
234234
235 if len(testlist) != len(set(testlist)): # Jos duplikaatti LEDejä
236 return -1
237 if len(self.terminals) != len(set(self.terminals)): # Jos duplikaatti LEDejä
238 return -2
235239 kytkemattomat = list(set(self.ledit) - set(testlist))
236 if kytkemattomat != []:
240 if kytkemattomat != []: # LED kytkemättä
237241 for k in kytkemattomat:
238242 lausekkeet[k] = 'x'
239243
300300 - self.komponentit korvataan self.devices
301301 - ei tue vielä 3+ input loogisia portteja, pitää miettiä jos senkin tekee kostruktorissa
302302 '''
303 '''
303304 for (dev_id, dev) in self.devices.items():
304305 if dev.dev_type and dev.label:
305306 if dev.dev_type == 'Toggle': # lisää muita input tyyppejä
311311 self.connectors = self.poista_input(dev_id, tyyppi, dev.num_inputs)
312312 dev = None
313313 return self.connectors
314 '''
314315
315316 def poista_input(self, dev_id, tyyppi, num_inputs):
316317 raise Error("ei toteutettu kunnolla vielä")
382382 komponentit = ['AND', 'NAND', 'OR', 'NOR', 'XOR', 'XNOR', 'EOR', 'ENOR', 'NOT', 'DC']
383383 for i in osat:
384384 if i not in komponentit:
385 l.terminals.add(i)
385 #l.terminals.add(i)
386 if i not in l.terminals:
387 l.terminals.append(i)
386388 # l.terminals = set([u'B4', u'A1', u'A3', u'A2', u'A4', u'B2', u'B3', u'B1'])
387389 lausekkeet[output.strip()] = lauseke
388390 return l.lausekkeesta_totuustaulu(lausekkeet)
405405 difference = ""
406406 for line in result:
407407 if line[0] == '+':
408 # print line
409408 virheita += 1
410409 difference += line
411410
420420 '''
421421 testitaulu = totuustaulu_kaaviosta(json.loads(testikaavio))
422422 oikeataulu = totuustaulu_kaaviosta(json.loads(oikeakaavio))
423 # print testitaulu
424 # print oikeataulu
423
425424 return onko_virheita(testitaulu, oikeataulu, maksimipisteet)
426425
427426
433433 Palauttaa virheiden lukumäärän ja virheelliset totuustaulun rivit
434434 '''
435435 testitaulu = totuustaulu_kaaviosta(json.loads(testikaavio))
436
437436 oikeataulu = totuustaulu_lausekkeesta(oikealauseke)
438 # print testitaulu
439 # print oikeataulu
437
440438 return onko_virheita(testitaulu, oikeataulu, maksimipisteet)
441439
442440def totuustaulu_muotoilu(totuustaulu):
490490 '''
491491 oikeataulu = totuustaulu_muotoilu(oikeatotuustaulu)
492492 testitaulu = totuustaulu_kaaviosta(json.loads(testikaavio))
493 # print testitaulu
494 # print oikeataulu
493
495494 return onko_virheita(testitaulu, oikeataulu, maksimipisteet)
496495
497496def onko_virheita(testitaulu, oikeataulu, maksimipisteet):
500500 :param maksimipisteet: tehtävän maksimipisteet
501501 :return: tehtävästä saadut pisteet, virheelliset rivit (tai 'oikein' -teksti)
502502 '''
503 if testitaulu == "": return 0.0, "Kytkennästä puuttuu sisäänmenoja tai ulostuloja\n"# jos tyhjä taulu
504 virheita, virherivit = testaa_totuustaulut(testitaulu, oikeataulu)
505503 oikeatrivit = oikeataulu.splitlines()
506504 riveja = len(oikeatrivit) - 1 # poistetaan muuttuja/otsikko -rivi
505 if testitaulu == "": # jos tyhjä taulu
506 return 0.0, "Kytkennästä puuttuu sisäänmenoja tai ulostuloja.\nSisäänmenot ja ulostulot tulee olla: " + oikeatrivit[0] + "\n"
507 if testitaulu == -1: # Duplikaatti LED
508 return 0.0, "Kytkennässä samannimisiä ulostuloja, poista ylimääräiset.\nSisäänmenot ja ulostulot tulee olla: " + oikeatrivit[0] + "\n"
509 if testitaulu == -2: # Duplikaatti kytkin
510 return 0.0, "Kytkennässä samannimisiä sisäänmenoja, poista ylimääräiset.\nSisäänmenot ja ulostulot tulee olla: " + oikeatrivit[0] + "\n"
511 virheita, virherivit = testaa_totuustaulut(testitaulu, oikeataulu)
507512 # Lisätään muuttujat ja output virheellisten rivien yläpuolelle
508513 virheet = ' ' + oikeatrivit[0] + '\n' + virherivit
509514 # maksimipisteet kerrotaan oikeiden rivien suhteella kaikkiin riveihin
510515 pistekertoja = (riveja-virheita)/riveja
511516 pisteet = round(maksimipisteet*pistekertoja*4)/4 # round to .25 intervals
512 #print(pisteet)
517
513518 if virheita == 0:
514519 return pisteet, "Oikein, täydet pisteet!\n" # pitäisikö tulostaa oikea totuustaulu?
520 if pisteet < 0:
521 return 0.0, "Kytkennässä on liikaa sisäänmenoja tai ulostuloja.\nSisäänmenot ja ulostulot tulee olla: " + oikeatrivit[0] + "\n"
515522 return pisteet, virheet
516523
517524if __name__ == '__main__':
testit.py
(16 / 0)
  
5959data = open('koe6_poisLEDkytkin.txt', 'r').read()
6060testit(otsikko, data, oikeadata, oikealauseke, oikeataulu, 1)
6161
62otsikko = 'Testi: Sininen ja Keltainen LED (ylimääräinen kytkin)'
63data = open('koe6_ylimKytkin.txt', 'r').read()
64testit(otsikko, data, oikeadata, oikealauseke, oikeataulu, 1)
65
66otsikko = 'Testi: Sininen ja Keltainen LED (ylimääräinen LED)'
67data = open('koe6_ylimLED.txt', 'r').read()
68testit(otsikko, data, oikeadata, oikealauseke, oikeataulu, 1)
69
70otsikko = 'Testi: Sininen ja Keltainen LED (duplikaatti LED (2 kpl keltaisia))'
71data = open('koe6_dupLED.txt', 'r').read()
72testit(otsikko, data, oikeadata, oikealauseke, oikeataulu, 1)
73
74otsikko = 'Testi: Sininen ja Keltainen LED (duplikaatti kytkin (2 kpl a))'
75data = open('koe6_dupKytkin.txt', 'r').read()
76testit(otsikko, data, oikeadata, oikealauseke, oikeataulu, 1)
77
6278otsikko = 'Testi: A1,A1,A2,A3 ja B1,B1,B2,B3 yhtäsuuruus, monimutkainen versio, jossa kaikki portit (koe8.txt yksi ENOR vaihdettu NOR:ksi)'
6379data = open('koe8.txt', 'r').read()
6480oikeadata = open('k8.txt', 'r').read()