"""Pruebas de las reglas E8 (implementación 1 y, si existe, la 2). Casos escritos a mano ANTES de medir: objetos inventados o vistos en la exploración (nunca de la muestra de cotejo, que aún no existe). Uso: python3 test_reglas_e8.py [impl2]""" import sys, os sys.path.insert(0, os.path.join(os.path.dirname(os.path.abspath(__file__)), '..', 'scripts')) usar2 = len(sys.argv) > 1 and sys.argv[1] == 'impl2' if usar2: import impl2_reglas as R else: import reglas_e8 as R fallos = 0; n = 0 def ok(cond, msg): global fallos, n n += 1 if not cond: fallos += 1; print('FALLO', msg) # ---------------- carburantes: producto P = [("Suministro de gasóleo C para calefacción de colegios", 'gasoleo_c'), ("Suministro de gasóleo B de calefacción para el pabellón", 'gasoleo_b'), # A1: la regla v2 lo daba como C ("Suministro de gasóleo a los colegios públicos del municipio", 'gasoleo_c'), # «a» preposición + contexto C ("Suministro de gasóleo A y gasóleo C", 'mixto'), ("Suministro de gasóleo A, gasolina y AdBlue para vehículos", 'mixto'), ("Suministro de 5.000 litros de gasóleo A para vehículos municipales", 'gasoleo_a'), ("Combustible para la flota de vehículos (gasóleo)", 'gasoleo_a'), ("Suministro de gasóleo agrícola", 'gasoleo_b'), ("Suministro de gasolina sin plomo 95", 'gasolina95'), ("Suministro de gasolina sin plomo 98", 'gasolina98'), ("Suministro de gasóleo y gasolina", 'mixto'), ("Suministro de combustible", 'sin_producto'), ("Suministro de gasoil tipo C a domicilio", 'gasoleo_c'), ("Subministrament de gasoli C per a l'escola", 'gasoleo_c')] for o, e in P: r = R.producto_carb(o); ok(r == e, f'producto {o!r}: {r} != {e}') # ---------------- carburantes: cantidad (reglas v2 de A1) Q = [("Suministro de 5.000 litros de gasóleo C", 5000.0), ("Gasóleo C 1,500 litres", 1500.0), ("Llenado de depósito de 3.000 litros de gasóleo", None), ("Suministro de gasóleo C", None)] for o, e in Q: r = R.cantidad_carb(o); v = r[0] if r else None; ok(v == e, f'litros {o!r}: {v} != {e}') # ---------------- electricidad E = [("Suministro eléctrico año 2024, para 34 instalaciones con un consumo aproximado de 55 GWh año.", 55e6, True), ("Acuerdo Marco 23/2017 para el suministro de energía eléctrica — Lote 2: Península para contratos basados de consumo inferior a 1.000.000 kWh", None, None), ("Suministro de energía eléctrica y gas natural — Lote 4: Suministro de gas natural para edificios con consumos inferiores a 15 GWh/año", None, None), ("Suministro de energía eléctrica para el año 2025. — Lote 4: Producción y distribución en Torrevieja. 1 CUPS-296 GWh.", 296e6, False), ("Lote 2 tarifa 3.1A numero de puntos 4 consumo estimado 624.606 kWh/año", 624606.0, True), ("Lote 1: (Alta tensión) 292 625 762 kWh", 292625762.0, False), ("subministrament d'energia elèctrica, durant el mes de desembre, amb un consum estimat de 15.000 kWh", 15000.0, False), ("Suministro de un sistema de almacenamiento de energía eléctrica basado en baterías con capacidad mínima de 20 Kwh", None, None), ("Energia facturada P759 kWh x 0.125466 €/kWh/ LL 1.505 kWh x 0,108382 €/kWh/ V 62 kWh x0,080753 €/kWh", None, None), ("Suministro de energía eléctrica — Lote 5: Resto de suministros. 164 CUPS-1,2 GWh.", 1.2e6, False), ("Suministro de energía eléctrica a los edificios municipales", None, None)] for o, kwh, an in E: r = R.energia_elec(o) if kwh is None: ok(r['motivo'] != 'ok', f'elec {o[:60]!r}: {r}') else: ok(r['motivo'] == 'ok' and abs(r['kwh'] - kwh) < 1e-6 and r['anual'] == an, f'elec {o[:60]!r}: {r} != {kwh},{an}') ok(R.banda_eurostat(15) == 'MWH_LT20' and R.banda_eurostat(624.606) == 'MWH500-1999' and R.banda_eurostat(55000) == 'MWH20000-69999', 'bandas') # ---------------- papel PA = [("Suministro de 80 cajas de papel ecológico fibra virgen A4", 80.0, 'virgen', 80), ("Suministro de 250 paquetes de 500 folios DIN-4 de fibra reciclada de 80 gramos", 50.0, 'reciclado', 80), ("Compra de 240 cajas de folios", 240.0, 'sin_fibra', 80), ("25 cajas de papel A4- 5 paquetes de folios por caja.", 25.0, 'sin_fibra', 80), ("Adquisición de 480 cajas (2.500 folios cada caja) de papel cortado A4 de 80 gr para la Base Aérea", 480.0, 'sin_fibra', 80), ("Adquisición urgente de 200 cajas de papel DIN-A-4 de 75 gr/m2 (500.000 unidades).", 200.0, 'sin_fibra', 75), ("Suministro de 1.000 paquetes (200 cajas) de papel A4 Blanco de 80 grs.", 200.0, 'sin_fibra', 80), ("Adquisición De 15 Cajas (75 Paquetes) De Papel Reciclado 80 G/M2, Formato A4", 15.0, 'reciclado', 80), ("Papel fotocopiadora DIN A4 80 gramos paquete de 500 hojas. Cantidad: 75 uds.", 15.0, 'sin_fibra', 80), ("Papel fotocopiadora DIN A4 80 gramos paquete de 500 hojas (16 unidades)", 3.2, 'sin_fibra', 80), ("COMPRA DE: Papel para fotocopiadora/impresora ( 10 cajas de 5x500 folios de A4 ).", 10.0, 'sin_fibra', 80), ("50 Paquetes de 100 hojas de papel DIN A4", 2.0, 'sin_fibra', 80), ("Adquisición de 3.000 paquetes de papel DIN-A4", 600.0, 'sin_fibra', 80), ("cm.96.23 suministro de 1.190 uds. de paquetes de 500 uds. de papel de oficina a4 75 gr.", 238.0, 'sin_fibra', 75), ("Suministro 458 cajas papel reciclado DIN A4 80g. lote nº2 Acuerdo Marco 20/2019.", 458.0, 'reciclado', 80), ("Suministro de 106 cajas de papel ecológico de impresión y escritura. Derivado de Acuerdo Marco. Lote 2.-2300CR20SUM00001-CD", 106.0, 'sin_fibra', 80), ("Subministrament de 240 paquets de 500 fulls DIN A-4 per als dispositius d’impressió", 48.0, 'sin_fibra', 80)] for o, cajas, fib, g in PA: r = R.papel(o) ok(r['motivo'] == 'ok' and abs(r['cajas_eq'] - cajas) < 1e-9 and r['fibra'] == fib and r['gramaje'] == g, f'papel {o[:70]!r}: {r} != {cajas},{fib},{g}') NO = [("Suministro 480 cajas papel ecológico A4 Y 15 A3", 'formato_no_a4'), ("Adquisición de 3 percheros de pared y 4 cajas de folios DIN A4", 'otros_articulos|excluido_articulo'), ("Suministro de 144 + 5 cajas de 5 paquetes de papel reciclado tamaños DINA4", 'suma'), ("12 resma Papel Din A 3 80 GM", 'formato_no_a4'), ("Suministro de 12 resmas de papel estucado magno formato 72x102", 'excluido_articulo|formato_no_a4'), ("PAPEL FOTOCOPIADORA COLOR COPY DIN A4 100 GRAMOS PAQUETE 500 HOJAS", 'excluido_articulo|gramaje_especial'), ("Suministro 700 uds. papel A4 para oficinas del Ayuntamiento", 'unidad_ambigua'), ("Papel reciclado A4 80g 500h 20 cajas. Paquete DIN-A4 80 g 500 hojas 70 paquetes.", 'varias_cantidades'), ("compra 10 caixes de paper blanc i reciclat, per la oag", 'fibra_mixta'), ("4200430220 resma de paper", 'sin_cantidad|unidad_ambigua'), ("Paquete 500 hojas papel reciclado din a4", 'sin_cantidad'), ("Suministro de sobres y papel necesarios para la emisión de facturas", 'excluido_articulo')] for o, mot in NO: r = R.papel(o); ok(r['motivo'] in mot.split('|'), f'papel NO {o[:60]!r}: {r["motivo"]} ∉ {mot}') print(('impl2' if usar2 else 'impl1'), 'comprobaciones', n, 'fallos', fallos) sys.exit(1 if fallos else 0)