Fix coverage with several contract classes; table annotation and file path checks; clean task dir on write
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_014aUaQeLnwbb1zTpN7kHeat
This commit is contained in:
@@ -197,6 +197,12 @@ def lint_files(b):
|
|||||||
re.I)):
|
re.I)):
|
||||||
errs.append(f"reference class {o.get('name')} has no testclasses_file (local unit tests)")
|
errs.append(f"reference class {o.get('name')} has no testclasses_file (local unit tests)")
|
||||||
for rel, src in b.get("files", {}).items():
|
for rel, src in b.get("files", {}).items():
|
||||||
|
# G0121, G0122: SAP says only "Can't save due to errors in source" for these
|
||||||
|
if re.search(r"^\s*define\s+table\b", src, re.I | re.M):
|
||||||
|
for ann in ("tableCategory", "deliveryClass"):
|
||||||
|
if not re.search(rf"@AbapCatalog\.{ann}\s*:", src, re.I):
|
||||||
|
errs.append(f"{rel}: a table needs the annotation @AbapCatalog.{ann} "
|
||||||
|
"(for example #TRANSPARENT, #A)")
|
||||||
if DDL_KIND.search(src):
|
if DDL_KIND.search(src):
|
||||||
for f in re.findall(r"^\s*(?:key\s+)?(\w+)\s*:", src, re.I | re.M):
|
for f in re.findall(r"^\s*(?:key\s+)?(\w+)\s*:", src, re.I | re.M):
|
||||||
if f.upper() in RESERVED:
|
if f.upper() in RESERVED:
|
||||||
@@ -278,6 +284,9 @@ def check_bundle(b):
|
|||||||
errs.append("stop task: expected_gap needs description and keywords")
|
errs.append("stop task: expected_gap needs description and keywords")
|
||||||
if "spec.md" not in files:
|
if "spec.md" not in files:
|
||||||
errs.append("spec.md missing")
|
errs.append("spec.md missing")
|
||||||
|
for rel in files: # G0106: a key "seed/" (a directory) crashed write_bundle
|
||||||
|
if not rel or rel.endswith("/") or rel.startswith("/") or ".." in rel.split("/"):
|
||||||
|
errs.append(f"files: '{rel}' is not a valid relative file path")
|
||||||
for k in ("seed", "hidden_tests", "reference"):
|
for k in ("seed", "hidden_tests", "reference"):
|
||||||
for o in t.get(k, []):
|
for o in t.get(k, []):
|
||||||
for fk in ("file", "testclasses_file"):
|
for fk in ("file", "testclasses_file"):
|
||||||
@@ -326,7 +335,16 @@ def floor_budget(task):
|
|||||||
bud["max_tool_calls"] = max(int(bud.get("max_tool_calls", 0)), 3 * calls)
|
bud["max_tool_calls"] = max(int(bud.get("max_tool_calls", 0)), 3 * calls)
|
||||||
|
|
||||||
|
|
||||||
|
KEEP_FILES = {"generation.json", "review.json"}
|
||||||
|
|
||||||
|
|
||||||
def write_bundle(b, task_dir, task_id):
|
def write_bundle(b, task_dir, task_id):
|
||||||
|
# remove the files of an earlier attempt (G0003 kept an unused seed/course.ddls.abap)
|
||||||
|
if os.path.isdir(task_dir):
|
||||||
|
for name in os.listdir(task_dir):
|
||||||
|
if name not in KEEP_FILES:
|
||||||
|
path = os.path.join(task_dir, name)
|
||||||
|
shutil.rmtree(path) if os.path.isdir(path) else os.remove(path)
|
||||||
os.makedirs(task_dir, exist_ok=True)
|
os.makedirs(task_dir, exist_ok=True)
|
||||||
b["task"]["id"] = task_id
|
b["task"]["id"] = task_id
|
||||||
for k in ("seed", "reference"):
|
for k in ("seed", "reference"):
|
||||||
|
|||||||
@@ -322,8 +322,11 @@ class Runner:
|
|||||||
if st.get("step") == "unittest":
|
if st.get("step") == "unittest":
|
||||||
own["tests"] += st.get("tests", 0)
|
own["tests"] += st.get("tests", 0)
|
||||||
own["failures"] += st.get("failures", 0)
|
own["failures"] += st.get("failures", 0)
|
||||||
cov = st.get("coverage", {}).get("class", {}).get("statement", {})
|
# several contract classes (exception classes + main class): only a class with
|
||||||
own["coverage"] = cov.get("percent")
|
# tests has a coverage figure; a later class without tests must not reset it to 0
|
||||||
|
cov = st.get("coverage", {}).get("class", {}).get("statement", {}).get("percent")
|
||||||
|
if st.get("tests", 0) and cov is not None:
|
||||||
|
own["coverage"] = max(own["coverage"] or 0, cov)
|
||||||
if c["type"] == "PROG" and g["G1_active"]: # local test classes inside the report
|
if c["type"] == "PROG" and g["G1_active"]: # local test classes inside the report
|
||||||
_, t = mcp.call("sap_run_unit_test", {"objectType": "PROG", "objectName": c["name"]})
|
_, t = mcp.call("sap_run_unit_test", {"objectType": "PROG", "objectName": c["name"]})
|
||||||
for prog in (_json(t) or {}).get("programs", []):
|
for prog in (_json(t) or {}).get("programs", []):
|
||||||
|
|||||||
@@ -1,55 +0,0 @@
|
|||||||
INTERFACE {{p}}if_tour_planner PUBLIC.
|
|
||||||
TYPES ty_status TYPE c LENGTH 10.
|
|
||||||
|
|
||||||
CONSTANTS:
|
|
||||||
BEGIN OF c_status,
|
|
||||||
ok TYPE ty_status VALUE 'OK',
|
|
||||||
invalid TYPE ty_status VALUE 'INVALID',
|
|
||||||
duplicate TYPE ty_status VALUE 'DUPLICATE',
|
|
||||||
END OF c_status.
|
|
||||||
|
|
||||||
TYPES:
|
|
||||||
BEGIN OF ty_item,
|
|
||||||
tour_id TYPE c LENGTH 4,
|
|
||||||
stop_no TYPE i,
|
|
||||||
customer TYPE c LENGTH 10,
|
|
||||||
packages TYPE i,
|
|
||||||
weight TYPE p LENGTH 8 DECIMALS 2,
|
|
||||||
END OF ty_item,
|
|
||||||
tt_item TYPE STANDARD TABLE OF ty_item WITH EMPTY KEY,
|
|
||||||
|
|
||||||
BEGIN OF ty_tour,
|
|
||||||
tour_id TYPE c LENGTH 4,
|
|
||||||
stops TYPE i,
|
|
||||||
packages TYPE i,
|
|
||||||
weight TYPE p LENGTH 8 DECIMALS 2,
|
|
||||||
END OF ty_tour,
|
|
||||||
tt_tour TYPE STANDARD TABLE OF ty_tour WITH EMPTY KEY.
|
|
||||||
|
|
||||||
METHODS add_item
|
|
||||||
IMPORTING iv_tour_id TYPE c LENGTH 4
|
|
||||||
iv_stop_no TYPE i
|
|
||||||
iv_customer TYPE c LENGTH 10
|
|
||||||
iv_packages TYPE i
|
|
||||||
iv_weight TYPE p LENGTH 8 DECIMALS 2
|
|
||||||
RETURNING VALUE(rv_status) TYPE ty_status.
|
|
||||||
|
|
||||||
METHODS remove_tour
|
|
||||||
IMPORTING iv_tour_id TYPE c LENGTH 4
|
|
||||||
RETURNING VALUE(rv_count) TYPE i.
|
|
||||||
|
|
||||||
METHODS items
|
|
||||||
RETURNING VALUE(rt_item) TYPE tt_item.
|
|
||||||
|
|
||||||
METHODS stops_of_tour
|
|
||||||
IMPORTING iv_tour_id TYPE c LENGTH 4
|
|
||||||
RETURNING VALUE(rt_item) TYPE tt_item.
|
|
||||||
|
|
||||||
METHODS find_stop
|
|
||||||
IMPORTING iv_tour_id TYPE c LENGTH 4
|
|
||||||
iv_stop_no TYPE i
|
|
||||||
RETURNING VALUE(rs_item) TYPE ty_item.
|
|
||||||
|
|
||||||
METHODS tour_summary
|
|
||||||
RETURNING VALUE(rt_tour) TYPE tt_tour.
|
|
||||||
ENDINTERFACE.
|
|
||||||
@@ -1,8 +0,0 @@
|
|||||||
define table {{P}}COURSE {
|
|
||||||
key mandt : abap.clnt not null;
|
|
||||||
key course_id : abap.char(10) not null;
|
|
||||||
category : abap.char(10);
|
|
||||||
title : abap.char(40);
|
|
||||||
capacity : abap.int4;
|
|
||||||
booked : abap.int4;
|
|
||||||
}
|
|
||||||
@@ -1,9 +0,0 @@
|
|||||||
@EndUserText.label : 'Training courses'
|
|
||||||
define table {{P}}COURSE {
|
|
||||||
key mandt : abap.clnt not null;
|
|
||||||
key course_id : abap.char(10) not null;
|
|
||||||
category : abap.char(10);
|
|
||||||
title : abap.char(40);
|
|
||||||
capacity : abap.int4;
|
|
||||||
booked : abap.int4;
|
|
||||||
}
|
|
||||||
@@ -1,18 +0,0 @@
|
|||||||
CLASS {{p}}seed_data DEFINITION PUBLIC FINAL CREATE PUBLIC.
|
|
||||||
PUBLIC SECTION.
|
|
||||||
INTERFACES if_oo_adt_classrun.
|
|
||||||
ENDCLASS.
|
|
||||||
|
|
||||||
|
|
||||||
CLASS {{p}}seed_data IMPLEMENTATION.
|
|
||||||
METHOD if_oo_adt_classrun~main.
|
|
||||||
DELETE FROM {{p}}zones.
|
|
||||||
INSERT {{p}}zones FROM TABLE @( VALUE #(
|
|
||||||
( zone_code = 'DE01' country = 'DE' base_fee = '5.00' price_per_kg = '1.20' max_weight_kg = 31 currency = 'EUR' )
|
|
||||||
( zone_code = 'DE02' country = 'DE' base_fee = '8.00' price_per_kg = '1.80' max_weight_kg = 31 currency = 'EUR' )
|
|
||||||
( zone_code = 'FR01' country = 'FR' base_fee = '9.50' price_per_kg = '2.10' max_weight_kg = 30 currency = 'EUR' )
|
|
||||||
( zone_code = 'US01' country = 'US' base_fee = '14.00' price_per_kg = '3.40' max_weight_kg = 25 currency = 'USD' )
|
|
||||||
( zone_code = 'CN01' country = 'CN' base_fee = '18.00' price_per_kg = '4.25' max_weight_kg = 20 currency = 'CNY' ) ) ).
|
|
||||||
out->write( |Zones seeded| ).
|
|
||||||
ENDMETHOD.
|
|
||||||
ENDCLASS.
|
|
||||||
@@ -1,10 +0,0 @@
|
|||||||
@EndUserText.label : 'Zone tariff'
|
|
||||||
define table {{p}}zones {
|
|
||||||
key mandt : abap.clnt not null;
|
|
||||||
key zone_code : abap.char(4) not null;
|
|
||||||
country : abap.char(2) not null;
|
|
||||||
base_fee : abap.dec(15,2) not null;
|
|
||||||
price_per_kg : abap.dec(15,2) not null;
|
|
||||||
max_weight_kg : abap.int4 not null;
|
|
||||||
currency : abap.char(5) not null;
|
|
||||||
}
|
|
||||||
@@ -1,25 +0,0 @@
|
|||||||
CLASS ltc_legacy_freight DEFINITION FINAL FOR TESTING DURATION SHORT RISK LEVEL HARMLESS.
|
|
||||||
PRIVATE SECTION.
|
|
||||||
METHODS base_parcel FOR TESTING.
|
|
||||||
METHODS express_parcel FOR TESTING.
|
|
||||||
ENDCLASS.
|
|
||||||
|
|
||||||
|
|
||||||
CLASS ltc_legacy_freight IMPLEMENTATION.
|
|
||||||
METHOD base_parcel.
|
|
||||||
DATA(lo_cut) = NEW {{p}}freight_calculator( ).
|
|
||||||
cl_abap_unit_assert=>assert_equals(
|
|
||||||
exp = VALUE {{p}}freight_calculator=>ty_result( status = 'OK' base = '45.00' total = '45.00' )
|
|
||||||
act = lo_cut->calculate( iv_weight_kg = '10.00' iv_zone = `DE` ) ).
|
|
||||||
ENDMETHOD.
|
|
||||||
|
|
||||||
METHOD express_parcel.
|
|
||||||
DATA(lo_cut) = NEW {{p}}freight_calculator( ).
|
|
||||||
cl_abap_unit_assert=>assert_equals(
|
|
||||||
exp = VALUE {{p}}freight_calculator=>ty_result( status = 'OK'
|
|
||||||
base = '45.00'
|
|
||||||
surcharge = '11.25'
|
|
||||||
total = '56.25' )
|
|
||||||
act = lo_cut->calculate( iv_weight_kg = '10.00' iv_zone = `DE` iv_express = abap_true ) ).
|
|
||||||
ENDMETHOD.
|
|
||||||
ENDCLASS.
|
|
||||||
@@ -1,53 +0,0 @@
|
|||||||
CLASS {{p}}shipping_cost_calc DEFINITION PUBLIC FINAL CREATE PUBLIC.
|
|
||||||
PUBLIC SECTION.
|
|
||||||
INTERFACES {{p}}if_shipping_cost.
|
|
||||||
|
|
||||||
PRIVATE SECTION.
|
|
||||||
METHODS base_rate
|
|
||||||
IMPORTING iv_weight TYPE {{p}}if_shipping_cost=>ty_weight
|
|
||||||
RETURNING VALUE(rv_rate) TYPE {{p}}if_shipping_cost=>ty_amount.
|
|
||||||
|
|
||||||
METHODS express_surcharge
|
|
||||||
IMPORTING iv_rate TYPE {{p}}if_shipping_cost=>ty_amount
|
|
||||||
RETURNING VALUE(rv_surcharge) TYPE {{p}}if_shipping_cost=>ty_amount.
|
|
||||||
ENDCLASS.
|
|
||||||
|
|
||||||
|
|
||||||
CLASS {{p}}shipping_cost_calc IMPLEMENTATION.
|
|
||||||
METHOD {{p}}if_shipping_cost~calculate.
|
|
||||||
IF iv_weight <= 0.
|
|
||||||
RETURN.
|
|
||||||
ENDIF.
|
|
||||||
|
|
||||||
rv_cost = base_rate( iv_weight ).
|
|
||||||
|
|
||||||
IF rv_cost < {{p}}if_shipping_cost=>c_rate-min_charge.
|
|
||||||
rv_cost = {{p}}if_shipping_cost=>c_rate-min_charge.
|
|
||||||
ENDIF.
|
|
||||||
|
|
||||||
IF iv_express = abap_true.
|
|
||||||
rv_cost = rv_cost + express_surcharge( rv_cost ).
|
|
||||||
ENDIF.
|
|
||||||
ENDMETHOD.
|
|
||||||
|
|
||||||
METHOD base_rate.
|
|
||||||
IF iv_weight < 1.
|
|
||||||
rv_rate = '4.90'.
|
|
||||||
ELSEIF iv_weight < 5.
|
|
||||||
rv_rate = '8.50'.
|
|
||||||
ELSEIF iv_weight < 10.
|
|
||||||
rv_rate = '12.00'.
|
|
||||||
ELSEIF iv_weight < {{p}}if_shipping_cost=>c_rate-bulk_weight.
|
|
||||||
rv_rate = '18.75'.
|
|
||||||
ELSE.
|
|
||||||
DATA lv_started_kg TYPE i.
|
|
||||||
lv_started_kg = iv_weight - {{p}}if_shipping_cost=>c_rate-bulk_weight.
|
|
||||||
rv_rate = '18.75' + lv_started_kg * {{p}}if_shipping_cost=>c_rate-bulk_step.
|
|
||||||
ENDIF.
|
|
||||||
ENDMETHOD.
|
|
||||||
|
|
||||||
METHOD express_surcharge.
|
|
||||||
rv_surcharge = round( val = iv_rate * {{p}}if_shipping_cost=>c_rate-express_percent / 100
|
|
||||||
dec = 2 ).
|
|
||||||
ENDMETHOD.
|
|
||||||
ENDCLASS.
|
|
||||||
@@ -1,38 +0,0 @@
|
|||||||
FUNCTION {{p}}repl_qty
|
|
||||||
IMPORTING
|
|
||||||
iv_stock TYPE decfloat34
|
|
||||||
iv_safety TYPE decfloat34
|
|
||||||
iv_lot_size TYPE decfloat34
|
|
||||||
iv_min_order TYPE decfloat34
|
|
||||||
EXPORTING
|
|
||||||
ev_order_qty TYPE decfloat34
|
|
||||||
ev_action TYPE string
|
|
||||||
EXCEPTIONS
|
|
||||||
invalid_input.
|
|
||||||
|
|
||||||
IF iv_lot_size < 0.
|
|
||||||
RAISE invalid_input.
|
|
||||||
ENDIF.
|
|
||||||
|
|
||||||
DATA lv_required TYPE decfloat34.
|
|
||||||
lv_required = iv_safety - iv_stock.
|
|
||||||
|
|
||||||
IF lv_required <= 0.
|
|
||||||
ev_order_qty = 0.
|
|
||||||
ev_action = 'NONE'.
|
|
||||||
RETURN.
|
|
||||||
ENDIF.
|
|
||||||
|
|
||||||
IF iv_lot_size > 0.
|
|
||||||
ev_order_qty = ( floor( lv_required / iv_lot_size ) + 1 ) * iv_lot_size.
|
|
||||||
ELSE.
|
|
||||||
ev_order_qty = lv_required.
|
|
||||||
ENDIF.
|
|
||||||
|
|
||||||
IF ev_order_qty < iv_min_order.
|
|
||||||
ev_order_qty = iv_min_order.
|
|
||||||
ENDIF.
|
|
||||||
|
|
||||||
ev_action = 'ORDER'.
|
|
||||||
|
|
||||||
ENDFUNCTION.
|
|
||||||
@@ -1,82 +0,0 @@
|
|||||||
REPORT {{p}}stock_net.
|
|
||||||
|
|
||||||
TYPES: BEGIN OF ty_key,
|
|
||||||
material TYPE {{p}}move-material,
|
|
||||||
plant TYPE {{p}}move-plant,
|
|
||||||
END OF ty_key,
|
|
||||||
BEGIN OF ty_out,
|
|
||||||
material TYPE {{p}}move-material,
|
|
||||||
plant TYPE {{p}}move-plant,
|
|
||||||
net_qty TYPE {{p}}move-quantity,
|
|
||||||
move_count TYPE i,
|
|
||||||
END OF ty_out.
|
|
||||||
|
|
||||||
DATA: gv_matnr TYPE {{p}}move-material,
|
|
||||||
gv_from TYPE d,
|
|
||||||
gv_to TYPE d,
|
|
||||||
gv_gr TYPE {{p}}move-quantity,
|
|
||||||
gv_gi TYPE {{p}}move-quantity,
|
|
||||||
gv_cnt TYPE i,
|
|
||||||
gs_key TYPE ty_key,
|
|
||||||
gs_out TYPE ty_out,
|
|
||||||
gt_keys TYPE STANDARD TABLE OF ty_key,
|
|
||||||
gt_out TYPE STANDARD TABLE OF ty_out,
|
|
||||||
go_alv TYPE REF TO cl_salv_table,
|
|
||||||
gx_msg TYPE REF TO cx_salv_msg.
|
|
||||||
|
|
||||||
PARAMETERS: p_from TYPE d OBLIGATORY,
|
|
||||||
p_to TYPE d OBLIGATORY.
|
|
||||||
SELECT-OPTIONS: s_matnr FOR gv_matnr.
|
|
||||||
|
|
||||||
START-OF-SELECTION.
|
|
||||||
gv_from = p_from.
|
|
||||||
gv_to = p_to.
|
|
||||||
|
|
||||||
SELECT DISTINCT material, plant
|
|
||||||
FROM {{p}}move
|
|
||||||
INTO TABLE gt_keys
|
|
||||||
WHERE move_date >= gv_from
|
|
||||||
AND move_date <= gv_to
|
|
||||||
AND material IN s_matnr
|
|
||||||
ORDER BY material, plant.
|
|
||||||
|
|
||||||
LOOP AT gt_keys INTO gs_key.
|
|
||||||
CLEAR: gv_gr, gv_gi, gv_cnt, gs_out.
|
|
||||||
|
|
||||||
SELECT SUM( quantity ) FROM {{p}}move INTO gv_gr
|
|
||||||
WHERE material = gs_key-material
|
|
||||||
AND plant = gs_key-plant
|
|
||||||
AND move_type = 'GR'
|
|
||||||
AND move_date >= gv_from
|
|
||||||
AND move_date <= gv_to.
|
|
||||||
|
|
||||||
SELECT SUM( quantity ) FROM {{p}}move INTO gv_gi
|
|
||||||
WHERE material = gs_key-material
|
|
||||||
AND plant = gs_key-plant
|
|
||||||
AND move_type = 'GI'
|
|
||||||
AND move_date >= gv_from
|
|
||||||
AND move_date <= gv_to.
|
|
||||||
|
|
||||||
SELECT COUNT(*) FROM {{p}}move INTO gv_cnt
|
|
||||||
WHERE material = gs_key-material
|
|
||||||
AND plant = gs_key-plant
|
|
||||||
AND move_date >= gv_from
|
|
||||||
AND move_date <= gv_to.
|
|
||||||
|
|
||||||
gs_out-material = gs_key-material.
|
|
||||||
gs_out-plant = gs_key-plant.
|
|
||||||
gs_out-net_qty = gv_gr - gv_gi.
|
|
||||||
gs_out-move_count = gv_cnt.
|
|
||||||
APPEND gs_out TO gt_out.
|
|
||||||
ENDLOOP.
|
|
||||||
|
|
||||||
TRY.
|
|
||||||
CALL METHOD cl_salv_table=>factory
|
|
||||||
IMPORTING
|
|
||||||
r_salv_table = go_alv
|
|
||||||
CHANGING
|
|
||||||
t_table = gt_out.
|
|
||||||
CALL METHOD go_alv->display.
|
|
||||||
CATCH cx_salv_msg INTO gx_msg.
|
|
||||||
MESSAGE gx_msg TYPE 'I' DISPLAY LIKE 'E'.
|
|
||||||
ENDTRY.
|
|
||||||
@@ -1,9 +0,0 @@
|
|||||||
@AccessControl.authorizationCheck: #NOT_REQUIRED
|
|
||||||
@EndUserText.label: 'Customer master'
|
|
||||||
define view entity {{P}}I_CUSTOMER
|
|
||||||
as select from {{p}}cust
|
|
||||||
{
|
|
||||||
key cust_id,
|
|
||||||
cust_name,
|
|
||||||
country
|
|
||||||
}
|
|
||||||
@@ -1,30 +0,0 @@
|
|||||||
CLASS {{p}}cx_rent_invalid DEFINITION
|
|
||||||
PUBLIC
|
|
||||||
INHERITING FROM cx_static_check
|
|
||||||
FINAL
|
|
||||||
CREATE PUBLIC.
|
|
||||||
|
|
||||||
PUBLIC SECTION.
|
|
||||||
METHODS constructor
|
|
||||||
IMPORTING textid LIKE textid OPTIONAL
|
|
||||||
previous LIKE previous OPTIONAL
|
|
||||||
iv_reason TYPE string OPTIONAL.
|
|
||||||
|
|
||||||
METHODS get_reason
|
|
||||||
RETURNING VALUE(rv_reason) TYPE string.
|
|
||||||
|
|
||||||
PRIVATE SECTION.
|
|
||||||
DATA mv_reason TYPE string.
|
|
||||||
ENDCLASS.
|
|
||||||
|
|
||||||
|
|
||||||
CLASS {{p}}cx_rent_invalid IMPLEMENTATION.
|
|
||||||
METHOD constructor.
|
|
||||||
super->constructor( textid = textid previous = previous ).
|
|
||||||
mv_reason = iv_reason.
|
|
||||||
ENDMETHOD.
|
|
||||||
|
|
||||||
METHOD get_reason.
|
|
||||||
rv_reason = mv_reason.
|
|
||||||
ENDMETHOD.
|
|
||||||
ENDCLASS.
|
|
||||||
88
tasks_gen/eval/G0100/faulty/m0_supplier_score.clas.abap
Normal file
88
tasks_gen/eval/G0100/faulty/m0_supplier_score.clas.abap
Normal file
@@ -0,0 +1,88 @@
|
|||||||
|
CLASS {{p}}supplier_score DEFINITION PUBLIC FINAL CREATE PUBLIC.
|
||||||
|
PUBLIC SECTION.
|
||||||
|
TYPES ty_rating TYPE i.
|
||||||
|
TYPES ty_score TYPE p LENGTH 5 DECIMALS 1.
|
||||||
|
TYPES ty_grade TYPE c LENGTH 1.
|
||||||
|
TYPES:
|
||||||
|
BEGIN OF ty_result,
|
||||||
|
score TYPE ty_score,
|
||||||
|
grade TYPE ty_grade,
|
||||||
|
END OF ty_result.
|
||||||
|
|
||||||
|
METHODS evaluate
|
||||||
|
IMPORTING iv_price TYPE ty_rating
|
||||||
|
iv_quality TYPE ty_rating
|
||||||
|
iv_delivery TYPE ty_rating
|
||||||
|
RETURNING VALUE(rs_result) TYPE ty_result.
|
||||||
|
|
||||||
|
PRIVATE SECTION.
|
||||||
|
CONSTANTS:
|
||||||
|
c_weight_price TYPE i VALUE 40,
|
||||||
|
c_weight_quality TYPE i VALUE 35,
|
||||||
|
c_weight_delivery TYPE i VALUE 25,
|
||||||
|
c_round_half TYPE i VALUE 5,
|
||||||
|
c_ten TYPE i VALUE 10,
|
||||||
|
c_tenth TYPE ty_score VALUE '0.1',
|
||||||
|
c_threshold_a TYPE ty_score VALUE '4.5',
|
||||||
|
c_threshold_b TYPE ty_score VALUE '3.5',
|
||||||
|
c_threshold_c TYPE ty_score VALUE '2.5',
|
||||||
|
c_threshold_d TYPE ty_score VALUE '1.5',
|
||||||
|
c_score_blocked TYPE ty_score VALUE '0.0',
|
||||||
|
c_grade_blocked TYPE ty_grade VALUE 'X'.
|
||||||
|
|
||||||
|
METHODS is_rating_valid
|
||||||
|
IMPORTING iv_rating TYPE ty_rating
|
||||||
|
RETURNING VALUE(rv_valid) TYPE abap_bool.
|
||||||
|
METHODS weighted_score
|
||||||
|
IMPORTING iv_price TYPE ty_rating
|
||||||
|
iv_quality TYPE ty_rating
|
||||||
|
iv_delivery TYPE ty_rating
|
||||||
|
RETURNING VALUE(rv_score) TYPE ty_score.
|
||||||
|
METHODS grade_of
|
||||||
|
IMPORTING iv_score TYPE ty_score
|
||||||
|
RETURNING VALUE(rv_grade) TYPE ty_grade.
|
||||||
|
ENDCLASS.
|
||||||
|
|
||||||
|
|
||||||
|
CLASS {{p}}supplier_score IMPLEMENTATION.
|
||||||
|
METHOD evaluate.
|
||||||
|
IF is_rating_valid( iv_price ) = abap_false
|
||||||
|
OR is_rating_valid( iv_quality ) <> abap_false
|
||||||
|
OR is_rating_valid( iv_delivery ) = abap_false
|
||||||
|
OR iv_quality = 1.
|
||||||
|
rs_result-score = c_score_blocked.
|
||||||
|
rs_result-grade = c_grade_blocked.
|
||||||
|
RETURN.
|
||||||
|
ENDIF.
|
||||||
|
rs_result-score = weighted_score( iv_price = iv_price
|
||||||
|
iv_quality = iv_quality
|
||||||
|
iv_delivery = iv_delivery ).
|
||||||
|
rs_result-grade = grade_of( rs_result-score ).
|
||||||
|
ENDMETHOD.
|
||||||
|
|
||||||
|
METHOD is_rating_valid.
|
||||||
|
rv_valid = xsdbool( iv_rating >= 1 AND iv_rating <= 5 ).
|
||||||
|
ENDMETHOD.
|
||||||
|
|
||||||
|
METHOD weighted_score.
|
||||||
|
DATA(lv_points) = iv_price * c_weight_price
|
||||||
|
+ iv_quality * c_weight_quality
|
||||||
|
+ iv_delivery * c_weight_delivery.
|
||||||
|
DATA(lv_tenths) = ( lv_points + c_round_half ) DIV c_ten.
|
||||||
|
rv_score = CONV ty_score( lv_tenths ) * c_tenth.
|
||||||
|
ENDMETHOD.
|
||||||
|
|
||||||
|
METHOD grade_of.
|
||||||
|
IF iv_score >= c_threshold_a.
|
||||||
|
rv_grade = 'A'.
|
||||||
|
ELSEIF iv_score >= c_threshold_b.
|
||||||
|
rv_grade = 'B'.
|
||||||
|
ELSEIF iv_score >= c_threshold_c.
|
||||||
|
rv_grade = 'C'.
|
||||||
|
ELSEIF iv_score >= c_threshold_d.
|
||||||
|
rv_grade = 'D'.
|
||||||
|
ELSE.
|
||||||
|
rv_grade = 'E'.
|
||||||
|
ENDIF.
|
||||||
|
ENDMETHOD.
|
||||||
|
ENDCLASS.
|
||||||
88
tasks_gen/eval/G0100/faulty/m1_supplier_score.clas.abap
Normal file
88
tasks_gen/eval/G0100/faulty/m1_supplier_score.clas.abap
Normal file
@@ -0,0 +1,88 @@
|
|||||||
|
CLASS {{p}}supplier_score DEFINITION PUBLIC FINAL CREATE PUBLIC.
|
||||||
|
PUBLIC SECTION.
|
||||||
|
TYPES ty_rating TYPE i.
|
||||||
|
TYPES ty_score TYPE p LENGTH 5 DECIMALS 1.
|
||||||
|
TYPES ty_grade TYPE c LENGTH 1.
|
||||||
|
TYPES:
|
||||||
|
BEGIN OF ty_result,
|
||||||
|
score TYPE ty_score,
|
||||||
|
grade TYPE ty_grade,
|
||||||
|
END OF ty_result.
|
||||||
|
|
||||||
|
METHODS evaluate
|
||||||
|
IMPORTING iv_price TYPE ty_rating
|
||||||
|
iv_quality TYPE ty_rating
|
||||||
|
iv_delivery TYPE ty_rating
|
||||||
|
RETURNING VALUE(rs_result) TYPE ty_result.
|
||||||
|
|
||||||
|
PRIVATE SECTION.
|
||||||
|
CONSTANTS:
|
||||||
|
c_weight_price TYPE i VALUE 40,
|
||||||
|
c_weight_quality TYPE i VALUE 35,
|
||||||
|
c_weight_delivery TYPE i VALUE 25,
|
||||||
|
c_round_half TYPE i VALUE 5,
|
||||||
|
c_ten TYPE i VALUE 10,
|
||||||
|
c_tenth TYPE ty_score VALUE '0.1',
|
||||||
|
c_threshold_a TYPE ty_score VALUE '4.5',
|
||||||
|
c_threshold_b TYPE ty_score VALUE '3.5',
|
||||||
|
c_threshold_c TYPE ty_score VALUE '2.5',
|
||||||
|
c_threshold_d TYPE ty_score VALUE '1.5',
|
||||||
|
c_score_blocked TYPE ty_score VALUE '0.0',
|
||||||
|
c_grade_blocked TYPE ty_grade VALUE 'X'.
|
||||||
|
|
||||||
|
METHODS is_rating_valid
|
||||||
|
IMPORTING iv_rating TYPE ty_rating
|
||||||
|
RETURNING VALUE(rv_valid) TYPE abap_bool.
|
||||||
|
METHODS weighted_score
|
||||||
|
IMPORTING iv_price TYPE ty_rating
|
||||||
|
iv_quality TYPE ty_rating
|
||||||
|
iv_delivery TYPE ty_rating
|
||||||
|
RETURNING VALUE(rv_score) TYPE ty_score.
|
||||||
|
METHODS grade_of
|
||||||
|
IMPORTING iv_score TYPE ty_score
|
||||||
|
RETURNING VALUE(rv_grade) TYPE ty_grade.
|
||||||
|
ENDCLASS.
|
||||||
|
|
||||||
|
|
||||||
|
CLASS {{p}}supplier_score IMPLEMENTATION.
|
||||||
|
METHOD evaluate.
|
||||||
|
IF is_rating_valid( iv_price ) = abap_false
|
||||||
|
OR is_rating_valid( iv_quality ) = abap_false
|
||||||
|
OR is_rating_valid( iv_delivery ) = abap_true
|
||||||
|
OR iv_quality = 1.
|
||||||
|
rs_result-score = c_score_blocked.
|
||||||
|
rs_result-grade = c_grade_blocked.
|
||||||
|
RETURN.
|
||||||
|
ENDIF.
|
||||||
|
rs_result-score = weighted_score( iv_price = iv_price
|
||||||
|
iv_quality = iv_quality
|
||||||
|
iv_delivery = iv_delivery ).
|
||||||
|
rs_result-grade = grade_of( rs_result-score ).
|
||||||
|
ENDMETHOD.
|
||||||
|
|
||||||
|
METHOD is_rating_valid.
|
||||||
|
rv_valid = xsdbool( iv_rating >= 1 AND iv_rating <= 5 ).
|
||||||
|
ENDMETHOD.
|
||||||
|
|
||||||
|
METHOD weighted_score.
|
||||||
|
DATA(lv_points) = iv_price * c_weight_price
|
||||||
|
+ iv_quality * c_weight_quality
|
||||||
|
+ iv_delivery * c_weight_delivery.
|
||||||
|
DATA(lv_tenths) = ( lv_points + c_round_half ) DIV c_ten.
|
||||||
|
rv_score = CONV ty_score( lv_tenths ) * c_tenth.
|
||||||
|
ENDMETHOD.
|
||||||
|
|
||||||
|
METHOD grade_of.
|
||||||
|
IF iv_score >= c_threshold_a.
|
||||||
|
rv_grade = 'A'.
|
||||||
|
ELSEIF iv_score >= c_threshold_b.
|
||||||
|
rv_grade = 'B'.
|
||||||
|
ELSEIF iv_score >= c_threshold_c.
|
||||||
|
rv_grade = 'C'.
|
||||||
|
ELSEIF iv_score >= c_threshold_d.
|
||||||
|
rv_grade = 'D'.
|
||||||
|
ELSE.
|
||||||
|
rv_grade = 'E'.
|
||||||
|
ENDIF.
|
||||||
|
ENDMETHOD.
|
||||||
|
ENDCLASS.
|
||||||
88
tasks_gen/eval/G0100/faulty/m2_supplier_score.clas.abap
Normal file
88
tasks_gen/eval/G0100/faulty/m2_supplier_score.clas.abap
Normal file
@@ -0,0 +1,88 @@
|
|||||||
|
CLASS {{p}}supplier_score DEFINITION PUBLIC FINAL CREATE PUBLIC.
|
||||||
|
PUBLIC SECTION.
|
||||||
|
TYPES ty_rating TYPE i.
|
||||||
|
TYPES ty_score TYPE p LENGTH 5 DECIMALS 1.
|
||||||
|
TYPES ty_grade TYPE c LENGTH 1.
|
||||||
|
TYPES:
|
||||||
|
BEGIN OF ty_result,
|
||||||
|
score TYPE ty_score,
|
||||||
|
grade TYPE ty_grade,
|
||||||
|
END OF ty_result.
|
||||||
|
|
||||||
|
METHODS evaluate
|
||||||
|
IMPORTING iv_price TYPE ty_rating
|
||||||
|
iv_quality TYPE ty_rating
|
||||||
|
iv_delivery TYPE ty_rating
|
||||||
|
RETURNING VALUE(rs_result) TYPE ty_result.
|
||||||
|
|
||||||
|
PRIVATE SECTION.
|
||||||
|
CONSTANTS:
|
||||||
|
c_weight_price TYPE i VALUE 40,
|
||||||
|
c_weight_quality TYPE i VALUE 35,
|
||||||
|
c_weight_delivery TYPE i VALUE 25,
|
||||||
|
c_round_half TYPE i VALUE 5,
|
||||||
|
c_ten TYPE i VALUE 10,
|
||||||
|
c_tenth TYPE ty_score VALUE '0.1',
|
||||||
|
c_threshold_a TYPE ty_score VALUE '4.5',
|
||||||
|
c_threshold_b TYPE ty_score VALUE '3.5',
|
||||||
|
c_threshold_c TYPE ty_score VALUE '2.5',
|
||||||
|
c_threshold_d TYPE ty_score VALUE '1.5',
|
||||||
|
c_score_blocked TYPE ty_score VALUE '0.0',
|
||||||
|
c_grade_blocked TYPE ty_grade VALUE 'X'.
|
||||||
|
|
||||||
|
METHODS is_rating_valid
|
||||||
|
IMPORTING iv_rating TYPE ty_rating
|
||||||
|
RETURNING VALUE(rv_valid) TYPE abap_bool.
|
||||||
|
METHODS weighted_score
|
||||||
|
IMPORTING iv_price TYPE ty_rating
|
||||||
|
iv_quality TYPE ty_rating
|
||||||
|
iv_delivery TYPE ty_rating
|
||||||
|
RETURNING VALUE(rv_score) TYPE ty_score.
|
||||||
|
METHODS grade_of
|
||||||
|
IMPORTING iv_score TYPE ty_score
|
||||||
|
RETURNING VALUE(rv_grade) TYPE ty_grade.
|
||||||
|
ENDCLASS.
|
||||||
|
|
||||||
|
|
||||||
|
CLASS {{p}}supplier_score IMPLEMENTATION.
|
||||||
|
METHOD evaluate.
|
||||||
|
IF is_rating_valid( iv_price ) = abap_false
|
||||||
|
OR is_rating_valid( iv_quality ) = abap_false
|
||||||
|
OR is_rating_valid( iv_delivery ) = abap_false
|
||||||
|
OR iv_quality = 1.
|
||||||
|
rs_result-score = c_score_blocked.
|
||||||
|
rs_result-grade = c_grade_blocked.
|
||||||
|
RETURN.
|
||||||
|
ENDIF.
|
||||||
|
rs_result-score = weighted_score( iv_price = iv_price
|
||||||
|
iv_quality = iv_quality
|
||||||
|
iv_delivery = iv_delivery ).
|
||||||
|
rs_result-grade = grade_of( rs_result-score ).
|
||||||
|
ENDMETHOD.
|
||||||
|
|
||||||
|
METHOD is_rating_valid.
|
||||||
|
rv_valid = xsdbool( iv_rating >= 1 AND iv_rating <= 6 ).
|
||||||
|
ENDMETHOD.
|
||||||
|
|
||||||
|
METHOD weighted_score.
|
||||||
|
DATA(lv_points) = iv_price * c_weight_price
|
||||||
|
+ iv_quality * c_weight_quality
|
||||||
|
+ iv_delivery * c_weight_delivery.
|
||||||
|
DATA(lv_tenths) = ( lv_points + c_round_half ) DIV c_ten.
|
||||||
|
rv_score = CONV ty_score( lv_tenths ) * c_tenth.
|
||||||
|
ENDMETHOD.
|
||||||
|
|
||||||
|
METHOD grade_of.
|
||||||
|
IF iv_score >= c_threshold_a.
|
||||||
|
rv_grade = 'A'.
|
||||||
|
ELSEIF iv_score >= c_threshold_b.
|
||||||
|
rv_grade = 'B'.
|
||||||
|
ELSEIF iv_score >= c_threshold_c.
|
||||||
|
rv_grade = 'C'.
|
||||||
|
ELSEIF iv_score >= c_threshold_d.
|
||||||
|
rv_grade = 'D'.
|
||||||
|
ELSE.
|
||||||
|
rv_grade = 'E'.
|
||||||
|
ENDIF.
|
||||||
|
ENDMETHOD.
|
||||||
|
ENDCLASS.
|
||||||
88
tasks_gen/eval/G0100/faulty/m3_supplier_score.clas.abap
Normal file
88
tasks_gen/eval/G0100/faulty/m3_supplier_score.clas.abap
Normal file
@@ -0,0 +1,88 @@
|
|||||||
|
CLASS {{p}}supplier_score DEFINITION PUBLIC FINAL CREATE PUBLIC.
|
||||||
|
PUBLIC SECTION.
|
||||||
|
TYPES ty_rating TYPE i.
|
||||||
|
TYPES ty_score TYPE p LENGTH 5 DECIMALS 1.
|
||||||
|
TYPES ty_grade TYPE c LENGTH 1.
|
||||||
|
TYPES:
|
||||||
|
BEGIN OF ty_result,
|
||||||
|
score TYPE ty_score,
|
||||||
|
grade TYPE ty_grade,
|
||||||
|
END OF ty_result.
|
||||||
|
|
||||||
|
METHODS evaluate
|
||||||
|
IMPORTING iv_price TYPE ty_rating
|
||||||
|
iv_quality TYPE ty_rating
|
||||||
|
iv_delivery TYPE ty_rating
|
||||||
|
RETURNING VALUE(rs_result) TYPE ty_result.
|
||||||
|
|
||||||
|
PRIVATE SECTION.
|
||||||
|
CONSTANTS:
|
||||||
|
c_weight_price TYPE i VALUE 40,
|
||||||
|
c_weight_quality TYPE i VALUE 35,
|
||||||
|
c_weight_delivery TYPE i VALUE 25,
|
||||||
|
c_round_half TYPE i VALUE 5,
|
||||||
|
c_ten TYPE i VALUE 10,
|
||||||
|
c_tenth TYPE ty_score VALUE '0.1',
|
||||||
|
c_threshold_a TYPE ty_score VALUE '4.5',
|
||||||
|
c_threshold_b TYPE ty_score VALUE '3.5',
|
||||||
|
c_threshold_c TYPE ty_score VALUE '2.5',
|
||||||
|
c_threshold_d TYPE ty_score VALUE '1.5',
|
||||||
|
c_score_blocked TYPE ty_score VALUE '0.0',
|
||||||
|
c_grade_blocked TYPE ty_grade VALUE 'X'.
|
||||||
|
|
||||||
|
METHODS is_rating_valid
|
||||||
|
IMPORTING iv_rating TYPE ty_rating
|
||||||
|
RETURNING VALUE(rv_valid) TYPE abap_bool.
|
||||||
|
METHODS weighted_score
|
||||||
|
IMPORTING iv_price TYPE ty_rating
|
||||||
|
iv_quality TYPE ty_rating
|
||||||
|
iv_delivery TYPE ty_rating
|
||||||
|
RETURNING VALUE(rv_score) TYPE ty_score.
|
||||||
|
METHODS grade_of
|
||||||
|
IMPORTING iv_score TYPE ty_score
|
||||||
|
RETURNING VALUE(rv_grade) TYPE ty_grade.
|
||||||
|
ENDCLASS.
|
||||||
|
|
||||||
|
|
||||||
|
CLASS {{p}}supplier_score IMPLEMENTATION.
|
||||||
|
METHOD evaluate.
|
||||||
|
IF is_rating_valid( iv_price ) = abap_false
|
||||||
|
OR is_rating_valid( iv_quality ) = abap_false
|
||||||
|
OR is_rating_valid( iv_delivery ) = abap_false
|
||||||
|
OR iv_quality = 1.
|
||||||
|
rs_result-score = c_score_blocked.
|
||||||
|
rs_result-grade = c_grade_blocked.
|
||||||
|
RETURN.
|
||||||
|
ENDIF.
|
||||||
|
rs_result-score = weighted_score( iv_price = iv_price
|
||||||
|
iv_quality = iv_quality
|
||||||
|
iv_delivery = iv_delivery ).
|
||||||
|
rs_result-grade = grade_of( rs_result-score ).
|
||||||
|
ENDMETHOD.
|
||||||
|
|
||||||
|
METHOD is_rating_valid.
|
||||||
|
rv_valid = xsdbool( iv_rating >= 1 AND iv_rating <= 5 ).
|
||||||
|
ENDMETHOD.
|
||||||
|
|
||||||
|
METHOD weighted_score.
|
||||||
|
DATA(lv_points) = iv_price * c_weight_price
|
||||||
|
- iv_quality * c_weight_quality
|
||||||
|
+ iv_delivery * c_weight_delivery.
|
||||||
|
DATA(lv_tenths) = ( lv_points + c_round_half ) DIV c_ten.
|
||||||
|
rv_score = CONV ty_score( lv_tenths ) * c_tenth.
|
||||||
|
ENDMETHOD.
|
||||||
|
|
||||||
|
METHOD grade_of.
|
||||||
|
IF iv_score >= c_threshold_a.
|
||||||
|
rv_grade = 'A'.
|
||||||
|
ELSEIF iv_score >= c_threshold_b.
|
||||||
|
rv_grade = 'B'.
|
||||||
|
ELSEIF iv_score >= c_threshold_c.
|
||||||
|
rv_grade = 'C'.
|
||||||
|
ELSEIF iv_score >= c_threshold_d.
|
||||||
|
rv_grade = 'D'.
|
||||||
|
ELSE.
|
||||||
|
rv_grade = 'E'.
|
||||||
|
ENDIF.
|
||||||
|
ENDMETHOD.
|
||||||
|
ENDCLASS.
|
||||||
88
tasks_gen/eval/G0100/faulty/m4_supplier_score.clas.abap
Normal file
88
tasks_gen/eval/G0100/faulty/m4_supplier_score.clas.abap
Normal file
@@ -0,0 +1,88 @@
|
|||||||
|
CLASS {{p}}supplier_score DEFINITION PUBLIC FINAL CREATE PUBLIC.
|
||||||
|
PUBLIC SECTION.
|
||||||
|
TYPES ty_rating TYPE i.
|
||||||
|
TYPES ty_score TYPE p LENGTH 5 DECIMALS 1.
|
||||||
|
TYPES ty_grade TYPE c LENGTH 1.
|
||||||
|
TYPES:
|
||||||
|
BEGIN OF ty_result,
|
||||||
|
score TYPE ty_score,
|
||||||
|
grade TYPE ty_grade,
|
||||||
|
END OF ty_result.
|
||||||
|
|
||||||
|
METHODS evaluate
|
||||||
|
IMPORTING iv_price TYPE ty_rating
|
||||||
|
iv_quality TYPE ty_rating
|
||||||
|
iv_delivery TYPE ty_rating
|
||||||
|
RETURNING VALUE(rs_result) TYPE ty_result.
|
||||||
|
|
||||||
|
PRIVATE SECTION.
|
||||||
|
CONSTANTS:
|
||||||
|
c_weight_price TYPE i VALUE 40,
|
||||||
|
c_weight_quality TYPE i VALUE 35,
|
||||||
|
c_weight_delivery TYPE i VALUE 25,
|
||||||
|
c_round_half TYPE i VALUE 5,
|
||||||
|
c_ten TYPE i VALUE 10,
|
||||||
|
c_tenth TYPE ty_score VALUE '0.1',
|
||||||
|
c_threshold_a TYPE ty_score VALUE '4.5',
|
||||||
|
c_threshold_b TYPE ty_score VALUE '3.5',
|
||||||
|
c_threshold_c TYPE ty_score VALUE '2.5',
|
||||||
|
c_threshold_d TYPE ty_score VALUE '1.5',
|
||||||
|
c_score_blocked TYPE ty_score VALUE '0.0',
|
||||||
|
c_grade_blocked TYPE ty_grade VALUE 'X'.
|
||||||
|
|
||||||
|
METHODS is_rating_valid
|
||||||
|
IMPORTING iv_rating TYPE ty_rating
|
||||||
|
RETURNING VALUE(rv_valid) TYPE abap_bool.
|
||||||
|
METHODS weighted_score
|
||||||
|
IMPORTING iv_price TYPE ty_rating
|
||||||
|
iv_quality TYPE ty_rating
|
||||||
|
iv_delivery TYPE ty_rating
|
||||||
|
RETURNING VALUE(rv_score) TYPE ty_score.
|
||||||
|
METHODS grade_of
|
||||||
|
IMPORTING iv_score TYPE ty_score
|
||||||
|
RETURNING VALUE(rv_grade) TYPE ty_grade.
|
||||||
|
ENDCLASS.
|
||||||
|
|
||||||
|
|
||||||
|
CLASS {{p}}supplier_score IMPLEMENTATION.
|
||||||
|
METHOD evaluate.
|
||||||
|
IF is_rating_valid( iv_price ) = abap_false
|
||||||
|
OR is_rating_valid( iv_quality ) = abap_false
|
||||||
|
OR is_rating_valid( iv_delivery ) = abap_false
|
||||||
|
OR iv_quality = 1.
|
||||||
|
rs_result-score = c_score_blocked.
|
||||||
|
rs_result-grade = c_grade_blocked.
|
||||||
|
RETURN.
|
||||||
|
ENDIF.
|
||||||
|
rs_result-score = weighted_score( iv_price = iv_price
|
||||||
|
iv_quality = iv_quality
|
||||||
|
iv_delivery = iv_delivery ).
|
||||||
|
rs_result-grade = grade_of( rs_result-score ).
|
||||||
|
ENDMETHOD.
|
||||||
|
|
||||||
|
METHOD is_rating_valid.
|
||||||
|
rv_valid = xsdbool( iv_rating >= 1 AND iv_rating <= 5 ).
|
||||||
|
ENDMETHOD.
|
||||||
|
|
||||||
|
METHOD weighted_score.
|
||||||
|
DATA(lv_points) = iv_price * c_weight_price
|
||||||
|
+ iv_quality * c_weight_quality
|
||||||
|
+ iv_delivery * c_weight_delivery.
|
||||||
|
DATA(lv_tenths) = ( lv_points + c_round_half ) DIV c_ten.
|
||||||
|
rv_score = CONV ty_score( lv_tenths ) * c_tenth.
|
||||||
|
ENDMETHOD.
|
||||||
|
|
||||||
|
METHOD grade_of.
|
||||||
|
IF iv_score < c_threshold_a.
|
||||||
|
rv_grade = 'A'.
|
||||||
|
ELSEIF iv_score >= c_threshold_b.
|
||||||
|
rv_grade = 'B'.
|
||||||
|
ELSEIF iv_score >= c_threshold_c.
|
||||||
|
rv_grade = 'C'.
|
||||||
|
ELSEIF iv_score >= c_threshold_d.
|
||||||
|
rv_grade = 'D'.
|
||||||
|
ELSE.
|
||||||
|
rv_grade = 'E'.
|
||||||
|
ENDIF.
|
||||||
|
ENDMETHOD.
|
||||||
|
ENDCLASS.
|
||||||
29
tasks_gen/eval/G0100/generation.json
Normal file
29
tasks_gen/eval/G0100/generation.json
Normal file
@@ -0,0 +1,29 @@
|
|||||||
|
{
|
||||||
|
"id": "G0100",
|
||||||
|
"pool": "eval",
|
||||||
|
"object_type": "CLAS",
|
||||||
|
"category": "A",
|
||||||
|
"attempts": [
|
||||||
|
{
|
||||||
|
"stage": "validate",
|
||||||
|
"oracle": 68.5,
|
||||||
|
"null": 0
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"stage": "validate",
|
||||||
|
"oracle": 68.5,
|
||||||
|
"null": 0
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"stage": "validate",
|
||||||
|
"oracle": 100.0,
|
||||||
|
"null": 0,
|
||||||
|
"mutation": {
|
||||||
|
"valid": 5,
|
||||||
|
"killed": 5,
|
||||||
|
"ok": true
|
||||||
|
}
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"accepted": true
|
||||||
|
}
|
||||||
98
tasks_gen/eval/G0100/hidden/t02_hidden.clas.abap
Normal file
98
tasks_gen/eval/G0100/hidden/t02_hidden.clas.abap
Normal file
@@ -0,0 +1,98 @@
|
|||||||
|
CLASS {{p}}t02_hidden DEFINITION PUBLIC FINAL CREATE PUBLIC
|
||||||
|
FOR TESTING DURATION SHORT RISK LEVEL HARMLESS.
|
||||||
|
PRIVATE SECTION.
|
||||||
|
CONSTANTS:
|
||||||
|
c_score_5_0 TYPE {{p}}supplier_score=>ty_score VALUE '5.0',
|
||||||
|
c_score_0_0 TYPE {{p}}supplier_score=>ty_score VALUE '0.0',
|
||||||
|
c_score_4_5 TYPE {{p}}supplier_score=>ty_score VALUE '4.5',
|
||||||
|
c_score_3_5 TYPE {{p}}supplier_score=>ty_score VALUE '3.5',
|
||||||
|
c_score_2_5 TYPE {{p}}supplier_score=>ty_score VALUE '2.5',
|
||||||
|
c_score_1_9 TYPE {{p}}supplier_score=>ty_score VALUE '1.9',
|
||||||
|
c_score_1_4 TYPE {{p}}supplier_score=>ty_score VALUE '1.4',
|
||||||
|
c_score_3_7 TYPE {{p}}supplier_score=>ty_score VALUE '3.7',
|
||||||
|
c_grade_a TYPE {{p}}supplier_score=>ty_grade VALUE 'A',
|
||||||
|
c_grade_b TYPE {{p}}supplier_score=>ty_grade VALUE 'B',
|
||||||
|
c_grade_c TYPE {{p}}supplier_score=>ty_grade VALUE 'C',
|
||||||
|
c_grade_d TYPE {{p}}supplier_score=>ty_grade VALUE 'D',
|
||||||
|
c_grade_e TYPE {{p}}supplier_score=>ty_grade VALUE 'E',
|
||||||
|
c_grade_x TYPE {{p}}supplier_score=>ty_grade VALUE 'X'.
|
||||||
|
DATA mo_cut TYPE REF TO {{p}}supplier_score.
|
||||||
|
METHODS setup.
|
||||||
|
METHODS perfect_supplier FOR TESTING.
|
||||||
|
METHODS quality_one_blocks FOR TESTING.
|
||||||
|
METHODS rating_below_range FOR TESTING.
|
||||||
|
METHODS rating_above_range FOR TESTING.
|
||||||
|
METHODS grade_a_boundary FOR TESTING.
|
||||||
|
METHODS rounds_up_to_b FOR TESTING.
|
||||||
|
METHODS grade_c_boundary FOR TESTING.
|
||||||
|
METHODS grade_d FOR TESTING.
|
||||||
|
METHODS grade_e FOR TESTING.
|
||||||
|
METHODS weights_quality FOR TESTING.
|
||||||
|
ENDCLASS.
|
||||||
|
|
||||||
|
|
||||||
|
CLASS {{p}}t02_hidden IMPLEMENTATION.
|
||||||
|
METHOD setup.
|
||||||
|
mo_cut = NEW {{p}}supplier_score( ).
|
||||||
|
ENDMETHOD.
|
||||||
|
|
||||||
|
METHOD perfect_supplier.
|
||||||
|
DATA(ls_result) = mo_cut->evaluate( iv_price = 5 iv_quality = 5 iv_delivery = 5 ).
|
||||||
|
cl_abap_unit_assert=>assert_equals( exp = c_score_5_0 act = ls_result-score ).
|
||||||
|
cl_abap_unit_assert=>assert_equals( exp = c_grade_a act = ls_result-grade ).
|
||||||
|
ENDMETHOD.
|
||||||
|
|
||||||
|
METHOD quality_one_blocks.
|
||||||
|
DATA(ls_result) = mo_cut->evaluate( iv_price = 5 iv_quality = 1 iv_delivery = 5 ).
|
||||||
|
cl_abap_unit_assert=>assert_equals( exp = c_score_0_0 act = ls_result-score ).
|
||||||
|
cl_abap_unit_assert=>assert_equals( exp = c_grade_x act = ls_result-grade ).
|
||||||
|
ENDMETHOD.
|
||||||
|
|
||||||
|
METHOD rating_below_range.
|
||||||
|
DATA(ls_result) = mo_cut->evaluate( iv_price = 0 iv_quality = 3 iv_delivery = 3 ).
|
||||||
|
cl_abap_unit_assert=>assert_equals( exp = c_score_0_0 act = ls_result-score ).
|
||||||
|
cl_abap_unit_assert=>assert_equals( exp = c_grade_x act = ls_result-grade ).
|
||||||
|
ENDMETHOD.
|
||||||
|
|
||||||
|
METHOD rating_above_range.
|
||||||
|
DATA(ls_result) = mo_cut->evaluate( iv_price = 3 iv_quality = 3 iv_delivery = 6 ).
|
||||||
|
cl_abap_unit_assert=>assert_equals( exp = c_score_0_0 act = ls_result-score ).
|
||||||
|
cl_abap_unit_assert=>assert_equals( exp = c_grade_x act = ls_result-grade ).
|
||||||
|
ENDMETHOD.
|
||||||
|
|
||||||
|
METHOD grade_a_boundary.
|
||||||
|
DATA(ls_result) = mo_cut->evaluate( iv_price = 5 iv_quality = 5 iv_delivery = 3 ).
|
||||||
|
cl_abap_unit_assert=>assert_equals( exp = c_score_4_5 act = ls_result-score ).
|
||||||
|
cl_abap_unit_assert=>assert_equals( exp = c_grade_a act = ls_result-grade ).
|
||||||
|
ENDMETHOD.
|
||||||
|
|
||||||
|
METHOD rounds_up_to_b.
|
||||||
|
DATA(ls_result) = mo_cut->evaluate( iv_price = 5 iv_quality = 2 iv_delivery = 3 ).
|
||||||
|
cl_abap_unit_assert=>assert_equals( exp = c_score_3_5 act = ls_result-score ).
|
||||||
|
cl_abap_unit_assert=>assert_equals( exp = c_grade_b act = ls_result-grade ).
|
||||||
|
ENDMETHOD.
|
||||||
|
|
||||||
|
METHOD grade_c_boundary.
|
||||||
|
DATA(ls_result) = mo_cut->evaluate( iv_price = 2 iv_quality = 2 iv_delivery = 4 ).
|
||||||
|
cl_abap_unit_assert=>assert_equals( exp = c_score_2_5 act = ls_result-score ).
|
||||||
|
cl_abap_unit_assert=>assert_equals( exp = c_grade_c act = ls_result-grade ).
|
||||||
|
ENDMETHOD.
|
||||||
|
|
||||||
|
METHOD grade_d.
|
||||||
|
DATA(ls_result) = mo_cut->evaluate( iv_price = 1 iv_quality = 2 iv_delivery = 3 ).
|
||||||
|
cl_abap_unit_assert=>assert_equals( exp = c_score_1_9 act = ls_result-score ).
|
||||||
|
cl_abap_unit_assert=>assert_equals( exp = c_grade_d act = ls_result-grade ).
|
||||||
|
ENDMETHOD.
|
||||||
|
|
||||||
|
METHOD grade_e.
|
||||||
|
DATA(ls_result) = mo_cut->evaluate( iv_price = 1 iv_quality = 2 iv_delivery = 1 ).
|
||||||
|
cl_abap_unit_assert=>assert_equals( exp = c_score_1_4 act = ls_result-score ).
|
||||||
|
cl_abap_unit_assert=>assert_equals( exp = c_grade_e act = ls_result-grade ).
|
||||||
|
ENDMETHOD.
|
||||||
|
|
||||||
|
METHOD weights_quality.
|
||||||
|
DATA(ls_result) = mo_cut->evaluate( iv_price = 3 iv_quality = 5 iv_delivery = 3 ).
|
||||||
|
cl_abap_unit_assert=>assert_equals( exp = c_score_3_7 act = ls_result-score ).
|
||||||
|
cl_abap_unit_assert=>assert_equals( exp = c_grade_b act = ls_result-grade ).
|
||||||
|
ENDMETHOD.
|
||||||
|
ENDCLASS.
|
||||||
79
tasks_gen/eval/G0100/mutation.json
Normal file
79
tasks_gen/eval/G0100/mutation.json
Normal file
@@ -0,0 +1,79 @@
|
|||||||
|
{
|
||||||
|
"task": "G0100",
|
||||||
|
"mutants": [
|
||||||
|
{
|
||||||
|
"object": "{{P}}SUPPLIER_SCORE",
|
||||||
|
"mutant": "line 50: = -> <> (eq)",
|
||||||
|
"status": "killed",
|
||||||
|
"hidden": "3/10",
|
||||||
|
"failed_tests": [
|
||||||
|
"GRADE_A_BOUNDARY",
|
||||||
|
"GRADE_C_BOUNDARY",
|
||||||
|
"GRADE_D",
|
||||||
|
"GRADE_E",
|
||||||
|
"PERFECT_SUPPLIER",
|
||||||
|
"ROUNDS_UP_TO_B",
|
||||||
|
"WEIGHTS_QUALITY"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"object": "{{P}}SUPPLIER_SCORE",
|
||||||
|
"mutant": "line 51: abap_false -> abap_true (bool)",
|
||||||
|
"status": "killed",
|
||||||
|
"hidden": "2/10",
|
||||||
|
"failed_tests": [
|
||||||
|
"GRADE_A_BOUNDARY",
|
||||||
|
"GRADE_C_BOUNDARY",
|
||||||
|
"GRADE_D",
|
||||||
|
"GRADE_E",
|
||||||
|
"PERFECT_SUPPLIER",
|
||||||
|
"RATING_ABOVE_RANGE",
|
||||||
|
"ROUNDS_UP_TO_B",
|
||||||
|
"WEIGHTS_QUALITY"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"object": "{{P}}SUPPLIER_SCORE",
|
||||||
|
"mutant": "line 64: 5 -> 6 (const)",
|
||||||
|
"status": "killed",
|
||||||
|
"hidden": "9/10",
|
||||||
|
"failed_tests": [
|
||||||
|
"RATING_ABOVE_RANGE"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"object": "{{P}}SUPPLIER_SCORE",
|
||||||
|
"mutant": "line 69: + -> - (arith)",
|
||||||
|
"status": "killed",
|
||||||
|
"hidden": "3/10",
|
||||||
|
"failed_tests": [
|
||||||
|
"GRADE_A_BOUNDARY",
|
||||||
|
"GRADE_C_BOUNDARY",
|
||||||
|
"GRADE_D",
|
||||||
|
"GRADE_E",
|
||||||
|
"PERFECT_SUPPLIER",
|
||||||
|
"ROUNDS_UP_TO_B",
|
||||||
|
"WEIGHTS_QUALITY"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"object": "{{P}}SUPPLIER_SCORE",
|
||||||
|
"mutant": "line 76: >= -> < (rel)",
|
||||||
|
"status": "killed",
|
||||||
|
"hidden": "3/10",
|
||||||
|
"failed_tests": [
|
||||||
|
"GRADE_A_BOUNDARY",
|
||||||
|
"GRADE_C_BOUNDARY",
|
||||||
|
"GRADE_D",
|
||||||
|
"GRADE_E",
|
||||||
|
"PERFECT_SUPPLIER",
|
||||||
|
"ROUNDS_UP_TO_B",
|
||||||
|
"WEIGHTS_QUALITY"
|
||||||
|
]
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"valid": 5,
|
||||||
|
"killed": 5,
|
||||||
|
"kill_rate": 1.0,
|
||||||
|
"ok": true
|
||||||
|
}
|
||||||
88
tasks_gen/eval/G0100/reference/supplier_score.clas.abap
Normal file
88
tasks_gen/eval/G0100/reference/supplier_score.clas.abap
Normal file
@@ -0,0 +1,88 @@
|
|||||||
|
CLASS {{p}}supplier_score DEFINITION PUBLIC FINAL CREATE PUBLIC.
|
||||||
|
PUBLIC SECTION.
|
||||||
|
TYPES ty_rating TYPE i.
|
||||||
|
TYPES ty_score TYPE p LENGTH 5 DECIMALS 1.
|
||||||
|
TYPES ty_grade TYPE c LENGTH 1.
|
||||||
|
TYPES:
|
||||||
|
BEGIN OF ty_result,
|
||||||
|
score TYPE ty_score,
|
||||||
|
grade TYPE ty_grade,
|
||||||
|
END OF ty_result.
|
||||||
|
|
||||||
|
METHODS evaluate
|
||||||
|
IMPORTING iv_price TYPE ty_rating
|
||||||
|
iv_quality TYPE ty_rating
|
||||||
|
iv_delivery TYPE ty_rating
|
||||||
|
RETURNING VALUE(rs_result) TYPE ty_result.
|
||||||
|
|
||||||
|
PRIVATE SECTION.
|
||||||
|
CONSTANTS:
|
||||||
|
c_weight_price TYPE i VALUE 40,
|
||||||
|
c_weight_quality TYPE i VALUE 35,
|
||||||
|
c_weight_delivery TYPE i VALUE 25,
|
||||||
|
c_round_half TYPE i VALUE 5,
|
||||||
|
c_ten TYPE i VALUE 10,
|
||||||
|
c_tenth TYPE ty_score VALUE '0.1',
|
||||||
|
c_threshold_a TYPE ty_score VALUE '4.5',
|
||||||
|
c_threshold_b TYPE ty_score VALUE '3.5',
|
||||||
|
c_threshold_c TYPE ty_score VALUE '2.5',
|
||||||
|
c_threshold_d TYPE ty_score VALUE '1.5',
|
||||||
|
c_score_blocked TYPE ty_score VALUE '0.0',
|
||||||
|
c_grade_blocked TYPE ty_grade VALUE 'X'.
|
||||||
|
|
||||||
|
METHODS is_rating_valid
|
||||||
|
IMPORTING iv_rating TYPE ty_rating
|
||||||
|
RETURNING VALUE(rv_valid) TYPE abap_bool.
|
||||||
|
METHODS weighted_score
|
||||||
|
IMPORTING iv_price TYPE ty_rating
|
||||||
|
iv_quality TYPE ty_rating
|
||||||
|
iv_delivery TYPE ty_rating
|
||||||
|
RETURNING VALUE(rv_score) TYPE ty_score.
|
||||||
|
METHODS grade_of
|
||||||
|
IMPORTING iv_score TYPE ty_score
|
||||||
|
RETURNING VALUE(rv_grade) TYPE ty_grade.
|
||||||
|
ENDCLASS.
|
||||||
|
|
||||||
|
|
||||||
|
CLASS {{p}}supplier_score IMPLEMENTATION.
|
||||||
|
METHOD evaluate.
|
||||||
|
IF is_rating_valid( iv_price ) = abap_false
|
||||||
|
OR is_rating_valid( iv_quality ) = abap_false
|
||||||
|
OR is_rating_valid( iv_delivery ) = abap_false
|
||||||
|
OR iv_quality = 1.
|
||||||
|
rs_result-score = c_score_blocked.
|
||||||
|
rs_result-grade = c_grade_blocked.
|
||||||
|
RETURN.
|
||||||
|
ENDIF.
|
||||||
|
rs_result-score = weighted_score( iv_price = iv_price
|
||||||
|
iv_quality = iv_quality
|
||||||
|
iv_delivery = iv_delivery ).
|
||||||
|
rs_result-grade = grade_of( rs_result-score ).
|
||||||
|
ENDMETHOD.
|
||||||
|
|
||||||
|
METHOD is_rating_valid.
|
||||||
|
rv_valid = xsdbool( iv_rating >= 1 AND iv_rating <= 5 ).
|
||||||
|
ENDMETHOD.
|
||||||
|
|
||||||
|
METHOD weighted_score.
|
||||||
|
DATA(lv_points) = iv_price * c_weight_price
|
||||||
|
+ iv_quality * c_weight_quality
|
||||||
|
+ iv_delivery * c_weight_delivery.
|
||||||
|
DATA(lv_tenths) = ( lv_points + c_round_half ) DIV c_ten.
|
||||||
|
rv_score = CONV ty_score( lv_tenths ) * c_tenth.
|
||||||
|
ENDMETHOD.
|
||||||
|
|
||||||
|
METHOD grade_of.
|
||||||
|
IF iv_score >= c_threshold_a.
|
||||||
|
rv_grade = 'A'.
|
||||||
|
ELSEIF iv_score >= c_threshold_b.
|
||||||
|
rv_grade = 'B'.
|
||||||
|
ELSEIF iv_score >= c_threshold_c.
|
||||||
|
rv_grade = 'C'.
|
||||||
|
ELSEIF iv_score >= c_threshold_d.
|
||||||
|
rv_grade = 'D'.
|
||||||
|
ELSE.
|
||||||
|
rv_grade = 'E'.
|
||||||
|
ENDIF.
|
||||||
|
ENDMETHOD.
|
||||||
|
ENDCLASS.
|
||||||
@@ -0,0 +1,54 @@
|
|||||||
|
CLASS ltc_supplier_score DEFINITION FINAL FOR TESTING
|
||||||
|
DURATION SHORT RISK LEVEL HARMLESS.
|
||||||
|
PRIVATE SECTION.
|
||||||
|
CONSTANTS:
|
||||||
|
c_score_5_0 TYPE {{p}}supplier_score=>ty_score VALUE '5.0',
|
||||||
|
c_score_0_0 TYPE {{p}}supplier_score=>ty_score VALUE '0.0',
|
||||||
|
c_score_3_5 TYPE {{p}}supplier_score=>ty_score VALUE '3.5',
|
||||||
|
c_grade_a TYPE {{p}}supplier_score=>ty_grade VALUE 'A',
|
||||||
|
c_grade_b TYPE {{p}}supplier_score=>ty_grade VALUE 'B',
|
||||||
|
c_grade_x TYPE {{p}}supplier_score=>ty_grade VALUE 'X'.
|
||||||
|
DATA mo_cut TYPE REF TO {{p}}supplier_score.
|
||||||
|
METHODS setup.
|
||||||
|
METHODS perfect_supplier FOR TESTING.
|
||||||
|
METHODS blocked_quality FOR TESTING.
|
||||||
|
METHODS invalid_rating FOR TESTING.
|
||||||
|
METHODS rounded_score FOR TESTING.
|
||||||
|
METHODS grade_check FOR TESTING.
|
||||||
|
ENDCLASS.
|
||||||
|
|
||||||
|
|
||||||
|
CLASS ltc_supplier_score IMPLEMENTATION.
|
||||||
|
METHOD setup.
|
||||||
|
mo_cut = NEW {{p}}supplier_score( ).
|
||||||
|
ENDMETHOD.
|
||||||
|
|
||||||
|
METHOD perfect_supplier.
|
||||||
|
DATA(ls_result) = mo_cut->evaluate( iv_price = 5 iv_quality = 5 iv_delivery = 5 ).
|
||||||
|
cl_abap_unit_assert=>assert_equals( exp = c_score_5_0 act = ls_result-score ).
|
||||||
|
cl_abap_unit_assert=>assert_equals( exp = c_grade_a act = ls_result-grade ).
|
||||||
|
ENDMETHOD.
|
||||||
|
|
||||||
|
METHOD blocked_quality.
|
||||||
|
DATA(ls_result) = mo_cut->evaluate( iv_price = 5 iv_quality = 1 iv_delivery = 5 ).
|
||||||
|
cl_abap_unit_assert=>assert_equals( exp = c_score_0_0 act = ls_result-score ).
|
||||||
|
cl_abap_unit_assert=>assert_equals( exp = c_grade_x act = ls_result-grade ).
|
||||||
|
ENDMETHOD.
|
||||||
|
|
||||||
|
METHOD invalid_rating.
|
||||||
|
DATA(ls_result) = mo_cut->evaluate( iv_price = 7 iv_quality = 3 iv_delivery = 3 ).
|
||||||
|
cl_abap_unit_assert=>assert_equals( exp = c_score_0_0 act = ls_result-score ).
|
||||||
|
cl_abap_unit_assert=>assert_equals( exp = c_grade_x act = ls_result-grade ).
|
||||||
|
ENDMETHOD.
|
||||||
|
|
||||||
|
METHOD rounded_score.
|
||||||
|
DATA(ls_result) = mo_cut->evaluate( iv_price = 5 iv_quality = 2 iv_delivery = 3 ).
|
||||||
|
cl_abap_unit_assert=>assert_equals( exp = c_score_3_5 act = ls_result-score ).
|
||||||
|
cl_abap_unit_assert=>assert_equals( exp = c_grade_b act = ls_result-grade ).
|
||||||
|
ENDMETHOD.
|
||||||
|
|
||||||
|
METHOD grade_check.
|
||||||
|
DATA(ls_result) = mo_cut->evaluate( iv_price = 1 iv_quality = 2 iv_delivery = 1 ).
|
||||||
|
cl_abap_unit_assert=>assert_equals( exp = 'E' act = ls_result-grade ).
|
||||||
|
ENDMETHOD.
|
||||||
|
ENDCLASS.
|
||||||
62
tasks_gen/eval/G0100/spec.md
Normal file
62
tasks_gen/eval/G0100/spec.md
Normal file
@@ -0,0 +1,62 @@
|
|||||||
|
# 1. Goal
|
||||||
|
A purchasing department rates its suppliers. A scorecard program calls the rating
|
||||||
|
before it prints the scorecard. The program needs the weighted score and the grade
|
||||||
|
of a supplier.
|
||||||
|
|
||||||
|
# 2. Open questions
|
||||||
|
None.
|
||||||
|
|
||||||
|
# 3. Context
|
||||||
|
- All objects are in package $TMP.
|
||||||
|
- A supplier is rated in three criteria: price, quality, and delivery.
|
||||||
|
- Each criterion gets an integer rating from 1 (very poor) to 5 (very good).
|
||||||
|
- The scorecard program passes the three ratings to the class. It reads the score
|
||||||
|
and the grade from the result.
|
||||||
|
|
||||||
|
# 4. Contract
|
||||||
|
- Create the class {{P}}SUPPLIER_SCORE in package $TMP.
|
||||||
|
- The class is public, final, and has a public constructor without parameters.
|
||||||
|
- The class has these public types:
|
||||||
|
- TY_RATING: an integer type for one rating.
|
||||||
|
- TY_SCORE: a packed number with length 5 and 1 decimal place.
|
||||||
|
- TY_GRADE: a character type with length 1.
|
||||||
|
- TY_RESULT: a structure with the components SCORE (type TY_SCORE) and GRADE
|
||||||
|
(type TY_GRADE).
|
||||||
|
- The class has exactly this public method:
|
||||||
|
|
||||||
|
METHODS evaluate
|
||||||
|
IMPORTING iv_price TYPE ty_rating
|
||||||
|
iv_quality TYPE ty_rating
|
||||||
|
iv_delivery TYPE ty_rating
|
||||||
|
RETURNING VALUE(rs_result) TYPE ty_result.
|
||||||
|
|
||||||
|
- Do not add other public methods.
|
||||||
|
|
||||||
|
# 5. Business rules
|
||||||
|
Apply the rules in this sequence.
|
||||||
|
|
||||||
|
1. A rating is valid if it is an integer from 1 to 5. If at least one of the three
|
||||||
|
ratings is not valid, return score 0.0 and grade 'X'.
|
||||||
|
2. Quality is a knock-out criterion. If the quality rating is 1, return score 0.0
|
||||||
|
and grade 'X'.
|
||||||
|
3. Calculate the weighted score:
|
||||||
|
score = (price * 40 + quality * 35 + delivery * 25) / 100.
|
||||||
|
4. Round the score to one decimal place. Use commercial rounding, that is, round
|
||||||
|
half away from zero.
|
||||||
|
5. Derive the grade from the rounded score:
|
||||||
|
- 4.5 or more: 'A'
|
||||||
|
- 3.5 or more: 'B'
|
||||||
|
- 2.5 or more: 'C'
|
||||||
|
- 1.5 or more: 'D'
|
||||||
|
- less than 1.5: 'E'
|
||||||
|
|
||||||
|
# 6. Constraints
|
||||||
|
- Release target: SAP_BASIS 816.
|
||||||
|
- Coding standards: Clean ABAP. Every method has fewer than 40 statements. No
|
||||||
|
global variables. No comment that restates the code.
|
||||||
|
- Out of scope: database access, ALV, dynpro, and changes to other objects.
|
||||||
|
|
||||||
|
# 7. Acceptance
|
||||||
|
- The class is active and has no syntax error.
|
||||||
|
- The hidden tests pass.
|
||||||
|
- Write your own ABAP Unit tests for the class.
|
||||||
41
tasks_gen/eval/G0100/task.json
Normal file
41
tasks_gen/eval/G0100/task.json
Normal file
@@ -0,0 +1,41 @@
|
|||||||
|
{
|
||||||
|
"id": "G0100",
|
||||||
|
"category": "A",
|
||||||
|
"object_type": "CLAS",
|
||||||
|
"difficulty": 2,
|
||||||
|
"release_target": "v816",
|
||||||
|
"expected_outcome": "implement",
|
||||||
|
"budget": {
|
||||||
|
"max_tool_calls": 50,
|
||||||
|
"max_activations": 12
|
||||||
|
},
|
||||||
|
"seed": [],
|
||||||
|
"contract": [
|
||||||
|
{
|
||||||
|
"type": "CLAS",
|
||||||
|
"name": "{{P}}SUPPLIER_SCORE"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"out_of_scope": [],
|
||||||
|
"hidden_tests": [
|
||||||
|
{
|
||||||
|
"type": "CLAS",
|
||||||
|
"name": "{{P}}T02_HIDDEN",
|
||||||
|
"file": "hidden/t02_hidden.clas.abap",
|
||||||
|
"description": "T02 hidden tests for the supplier score"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"reference": [
|
||||||
|
{
|
||||||
|
"type": "CLAS",
|
||||||
|
"name": "{{P}}SUPPLIER_SCORE",
|
||||||
|
"file": "reference/supplier_score.clas.abap",
|
||||||
|
"description": "Supplier score calculator",
|
||||||
|
"testclasses_file": "reference/supplier_score.testclasses.abap"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"craft_checks": [
|
||||||
|
"method_length",
|
||||||
|
"db_operation_in_loop"
|
||||||
|
]
|
||||||
|
}
|
||||||
102
tasks_gen/eval/G0101/faulty/m0_park_fee_calculator.clas.abap
Normal file
102
tasks_gen/eval/G0101/faulty/m0_park_fee_calculator.clas.abap
Normal file
@@ -0,0 +1,102 @@
|
|||||||
|
CLASS {{p}}park_fee_calculator DEFINITION PUBLIC FINAL CREATE PUBLIC.
|
||||||
|
PUBLIC SECTION.
|
||||||
|
INTERFACES {{p}}if_park_fee.
|
||||||
|
|
||||||
|
PRIVATE SECTION.
|
||||||
|
CONSTANTS:
|
||||||
|
c_price_per_hour TYPE {{p}}if_park_fee=>ty_amount VALUE '2.50',
|
||||||
|
c_lost_ticket TYPE {{p}}if_park_fee=>ty_amount VALUE '45.00',
|
||||||
|
c_max_fee TYPE {{p}}if_park_fee=>ty_amount VALUE '60.00',
|
||||||
|
c_discount_rate TYPE p LENGTH 3 DECIMALS 2 VALUE '0.75',
|
||||||
|
c_free_minutes TYPE i VALUE 15,
|
||||||
|
c_max_minutes TYPE i VALUE 43200,
|
||||||
|
c_seconds_per_day TYPE i VALUE 86400,
|
||||||
|
c_reference_date TYPE d VALUE '19000101',
|
||||||
|
c_sunday_offset TYPE i VALUE 6.
|
||||||
|
|
||||||
|
METHODS duration_in_minutes
|
||||||
|
IMPORTING iv_entry_date TYPE d
|
||||||
|
iv_entry_time TYPE t
|
||||||
|
iv_exit_date TYPE d
|
||||||
|
iv_exit_time TYPE t
|
||||||
|
RETURNING VALUE(rv_minutes) TYPE i.
|
||||||
|
METHODS started_hours
|
||||||
|
IMPORTING iv_minutes TYPE i
|
||||||
|
RETURNING VALUE(rv_hours) TYPE i.
|
||||||
|
METHODS is_sunday
|
||||||
|
IMPORTING iv_date TYPE d
|
||||||
|
RETURNING VALUE(rv_sunday) TYPE abap_bool.
|
||||||
|
METHODS discounted
|
||||||
|
IMPORTING iv_fee TYPE {{p}}if_park_fee=>ty_amount
|
||||||
|
iv_discount TYPE abap_bool
|
||||||
|
RETURNING VALUE(rv_fee) TYPE {{p}}if_park_fee=>ty_amount.
|
||||||
|
ENDCLASS.
|
||||||
|
|
||||||
|
|
||||||
|
CLASS {{p}}park_fee_calculator IMPLEMENTATION.
|
||||||
|
METHOD {{p}}if_park_fee~calculate.
|
||||||
|
DATA(lv_minutes) = duration_in_minutes( iv_entry_date = iv_entry_date
|
||||||
|
iv_entry_time = iv_entry_time
|
||||||
|
iv_exit_date = iv_exit_date
|
||||||
|
iv_exit_time = iv_exit_time ).
|
||||||
|
IF lv_minutes < 0.
|
||||||
|
rs_result = VALUE #( reason = {{p}}if_park_fee=>c_reason-bad_time
|
||||||
|
fee = 0 ).
|
||||||
|
RETURN.
|
||||||
|
ENDIF.
|
||||||
|
IF lv_minutes <= c_max_minutes.
|
||||||
|
rs_result = VALUE #( reason = {{p}}if_park_fee=>c_reason-too_long
|
||||||
|
fee = 0 ).
|
||||||
|
RETURN.
|
||||||
|
ENDIF.
|
||||||
|
IF iv_lost_ticket = abap_true.
|
||||||
|
rs_result = VALUE #( reason = {{p}}if_park_fee=>c_reason-ok
|
||||||
|
fee = c_lost_ticket ).
|
||||||
|
RETURN.
|
||||||
|
ENDIF.
|
||||||
|
IF lv_minutes <= c_free_minutes OR is_sunday( iv_entry_date ) = abap_true.
|
||||||
|
rs_result = VALUE #( reason = {{p}}if_park_fee=>c_reason-ok
|
||||||
|
fee = 0 ).
|
||||||
|
RETURN.
|
||||||
|
ENDIF.
|
||||||
|
DATA lv_fee TYPE {{p}}if_park_fee=>ty_amount.
|
||||||
|
lv_fee = started_hours( lv_minutes ) * c_price_per_hour.
|
||||||
|
lv_fee = discounted( iv_fee = lv_fee iv_discount = iv_discount ).
|
||||||
|
IF lv_fee > c_max_fee.
|
||||||
|
lv_fee = c_max_fee.
|
||||||
|
ENDIF.
|
||||||
|
rs_result = VALUE #( reason = {{p}}if_park_fee=>c_reason-ok
|
||||||
|
fee = lv_fee ).
|
||||||
|
ENDMETHOD.
|
||||||
|
|
||||||
|
METHOD duration_in_minutes.
|
||||||
|
DATA(lv_entry_time) = iv_entry_time.
|
||||||
|
DATA(lv_exit_time) = iv_exit_time.
|
||||||
|
lv_entry_time+4(2) = '00'.
|
||||||
|
lv_exit_time+4(2) = '00'.
|
||||||
|
DATA(lv_seconds) = ( iv_exit_date - iv_entry_date ) * c_seconds_per_day
|
||||||
|
+ ( lv_exit_time - lv_entry_time ).
|
||||||
|
rv_minutes = lv_seconds DIV 60.
|
||||||
|
ENDMETHOD.
|
||||||
|
|
||||||
|
METHOD started_hours.
|
||||||
|
rv_hours = iv_minutes DIV 60.
|
||||||
|
IF iv_minutes MOD 60 <> 0.
|
||||||
|
rv_hours = rv_hours + 1.
|
||||||
|
ENDIF.
|
||||||
|
ENDMETHOD.
|
||||||
|
|
||||||
|
METHOD is_sunday.
|
||||||
|
DATA(lv_offset) = iv_date - c_reference_date.
|
||||||
|
rv_sunday = xsdbool( lv_offset MOD 7 = c_sunday_offset ).
|
||||||
|
ENDMETHOD.
|
||||||
|
|
||||||
|
METHOD discounted.
|
||||||
|
rv_fee = iv_fee.
|
||||||
|
IF iv_discount = abap_true.
|
||||||
|
rv_fee = round( val = iv_fee * c_discount_rate
|
||||||
|
dec = 2
|
||||||
|
mode = cl_abap_math=>round_half_up ).
|
||||||
|
ENDIF.
|
||||||
|
ENDMETHOD.
|
||||||
|
ENDCLASS.
|
||||||
102
tasks_gen/eval/G0101/faulty/m1_park_fee_calculator.clas.abap
Normal file
102
tasks_gen/eval/G0101/faulty/m1_park_fee_calculator.clas.abap
Normal file
@@ -0,0 +1,102 @@
|
|||||||
|
CLASS {{p}}park_fee_calculator DEFINITION PUBLIC FINAL CREATE PUBLIC.
|
||||||
|
PUBLIC SECTION.
|
||||||
|
INTERFACES {{p}}if_park_fee.
|
||||||
|
|
||||||
|
PRIVATE SECTION.
|
||||||
|
CONSTANTS:
|
||||||
|
c_price_per_hour TYPE {{p}}if_park_fee=>ty_amount VALUE '2.50',
|
||||||
|
c_lost_ticket TYPE {{p}}if_park_fee=>ty_amount VALUE '45.00',
|
||||||
|
c_max_fee TYPE {{p}}if_park_fee=>ty_amount VALUE '60.00',
|
||||||
|
c_discount_rate TYPE p LENGTH 3 DECIMALS 2 VALUE '0.75',
|
||||||
|
c_free_minutes TYPE i VALUE 15,
|
||||||
|
c_max_minutes TYPE i VALUE 43200,
|
||||||
|
c_seconds_per_day TYPE i VALUE 86400,
|
||||||
|
c_reference_date TYPE d VALUE '19000101',
|
||||||
|
c_sunday_offset TYPE i VALUE 6.
|
||||||
|
|
||||||
|
METHODS duration_in_minutes
|
||||||
|
IMPORTING iv_entry_date TYPE d
|
||||||
|
iv_entry_time TYPE t
|
||||||
|
iv_exit_date TYPE d
|
||||||
|
iv_exit_time TYPE t
|
||||||
|
RETURNING VALUE(rv_minutes) TYPE i.
|
||||||
|
METHODS started_hours
|
||||||
|
IMPORTING iv_minutes TYPE i
|
||||||
|
RETURNING VALUE(rv_hours) TYPE i.
|
||||||
|
METHODS is_sunday
|
||||||
|
IMPORTING iv_date TYPE d
|
||||||
|
RETURNING VALUE(rv_sunday) TYPE abap_bool.
|
||||||
|
METHODS discounted
|
||||||
|
IMPORTING iv_fee TYPE {{p}}if_park_fee=>ty_amount
|
||||||
|
iv_discount TYPE abap_bool
|
||||||
|
RETURNING VALUE(rv_fee) TYPE {{p}}if_park_fee=>ty_amount.
|
||||||
|
ENDCLASS.
|
||||||
|
|
||||||
|
|
||||||
|
CLASS {{p}}park_fee_calculator IMPLEMENTATION.
|
||||||
|
METHOD {{p}}if_park_fee~calculate.
|
||||||
|
DATA(lv_minutes) = duration_in_minutes( iv_entry_date = iv_entry_date
|
||||||
|
iv_entry_time = iv_entry_time
|
||||||
|
iv_exit_date = iv_exit_date
|
||||||
|
iv_exit_time = iv_exit_time ).
|
||||||
|
IF lv_minutes < 0.
|
||||||
|
rs_result = VALUE #( reason = {{p}}if_park_fee=>c_reason-bad_time
|
||||||
|
fee = 0 ).
|
||||||
|
RETURN.
|
||||||
|
ENDIF.
|
||||||
|
IF lv_minutes > c_max_minutes.
|
||||||
|
rs_result = VALUE #( reason = {{p}}if_park_fee=>c_reason-too_long
|
||||||
|
fee = 0 ).
|
||||||
|
RETURN.
|
||||||
|
ENDIF.
|
||||||
|
IF iv_lost_ticket <> abap_true.
|
||||||
|
rs_result = VALUE #( reason = {{p}}if_park_fee=>c_reason-ok
|
||||||
|
fee = c_lost_ticket ).
|
||||||
|
RETURN.
|
||||||
|
ENDIF.
|
||||||
|
IF lv_minutes <= c_free_minutes OR is_sunday( iv_entry_date ) = abap_true.
|
||||||
|
rs_result = VALUE #( reason = {{p}}if_park_fee=>c_reason-ok
|
||||||
|
fee = 0 ).
|
||||||
|
RETURN.
|
||||||
|
ENDIF.
|
||||||
|
DATA lv_fee TYPE {{p}}if_park_fee=>ty_amount.
|
||||||
|
lv_fee = started_hours( lv_minutes ) * c_price_per_hour.
|
||||||
|
lv_fee = discounted( iv_fee = lv_fee iv_discount = iv_discount ).
|
||||||
|
IF lv_fee > c_max_fee.
|
||||||
|
lv_fee = c_max_fee.
|
||||||
|
ENDIF.
|
||||||
|
rs_result = VALUE #( reason = {{p}}if_park_fee=>c_reason-ok
|
||||||
|
fee = lv_fee ).
|
||||||
|
ENDMETHOD.
|
||||||
|
|
||||||
|
METHOD duration_in_minutes.
|
||||||
|
DATA(lv_entry_time) = iv_entry_time.
|
||||||
|
DATA(lv_exit_time) = iv_exit_time.
|
||||||
|
lv_entry_time+4(2) = '00'.
|
||||||
|
lv_exit_time+4(2) = '00'.
|
||||||
|
DATA(lv_seconds) = ( iv_exit_date - iv_entry_date ) * c_seconds_per_day
|
||||||
|
+ ( lv_exit_time - lv_entry_time ).
|
||||||
|
rv_minutes = lv_seconds DIV 60.
|
||||||
|
ENDMETHOD.
|
||||||
|
|
||||||
|
METHOD started_hours.
|
||||||
|
rv_hours = iv_minutes DIV 60.
|
||||||
|
IF iv_minutes MOD 60 <> 0.
|
||||||
|
rv_hours = rv_hours + 1.
|
||||||
|
ENDIF.
|
||||||
|
ENDMETHOD.
|
||||||
|
|
||||||
|
METHOD is_sunday.
|
||||||
|
DATA(lv_offset) = iv_date - c_reference_date.
|
||||||
|
rv_sunday = xsdbool( lv_offset MOD 7 = c_sunday_offset ).
|
||||||
|
ENDMETHOD.
|
||||||
|
|
||||||
|
METHOD discounted.
|
||||||
|
rv_fee = iv_fee.
|
||||||
|
IF iv_discount = abap_true.
|
||||||
|
rv_fee = round( val = iv_fee * c_discount_rate
|
||||||
|
dec = 2
|
||||||
|
mode = cl_abap_math=>round_half_up ).
|
||||||
|
ENDIF.
|
||||||
|
ENDMETHOD.
|
||||||
|
ENDCLASS.
|
||||||
102
tasks_gen/eval/G0101/faulty/m2_park_fee_calculator.clas.abap
Normal file
102
tasks_gen/eval/G0101/faulty/m2_park_fee_calculator.clas.abap
Normal file
@@ -0,0 +1,102 @@
|
|||||||
|
CLASS {{p}}park_fee_calculator DEFINITION PUBLIC FINAL CREATE PUBLIC.
|
||||||
|
PUBLIC SECTION.
|
||||||
|
INTERFACES {{p}}if_park_fee.
|
||||||
|
|
||||||
|
PRIVATE SECTION.
|
||||||
|
CONSTANTS:
|
||||||
|
c_price_per_hour TYPE {{p}}if_park_fee=>ty_amount VALUE '2.50',
|
||||||
|
c_lost_ticket TYPE {{p}}if_park_fee=>ty_amount VALUE '45.00',
|
||||||
|
c_max_fee TYPE {{p}}if_park_fee=>ty_amount VALUE '60.00',
|
||||||
|
c_discount_rate TYPE p LENGTH 3 DECIMALS 2 VALUE '0.75',
|
||||||
|
c_free_minutes TYPE i VALUE 15,
|
||||||
|
c_max_minutes TYPE i VALUE 43200,
|
||||||
|
c_seconds_per_day TYPE i VALUE 86400,
|
||||||
|
c_reference_date TYPE d VALUE '19000101',
|
||||||
|
c_sunday_offset TYPE i VALUE 6.
|
||||||
|
|
||||||
|
METHODS duration_in_minutes
|
||||||
|
IMPORTING iv_entry_date TYPE d
|
||||||
|
iv_entry_time TYPE t
|
||||||
|
iv_exit_date TYPE d
|
||||||
|
iv_exit_time TYPE t
|
||||||
|
RETURNING VALUE(rv_minutes) TYPE i.
|
||||||
|
METHODS started_hours
|
||||||
|
IMPORTING iv_minutes TYPE i
|
||||||
|
RETURNING VALUE(rv_hours) TYPE i.
|
||||||
|
METHODS is_sunday
|
||||||
|
IMPORTING iv_date TYPE d
|
||||||
|
RETURNING VALUE(rv_sunday) TYPE abap_bool.
|
||||||
|
METHODS discounted
|
||||||
|
IMPORTING iv_fee TYPE {{p}}if_park_fee=>ty_amount
|
||||||
|
iv_discount TYPE abap_bool
|
||||||
|
RETURNING VALUE(rv_fee) TYPE {{p}}if_park_fee=>ty_amount.
|
||||||
|
ENDCLASS.
|
||||||
|
|
||||||
|
|
||||||
|
CLASS {{p}}park_fee_calculator IMPLEMENTATION.
|
||||||
|
METHOD {{p}}if_park_fee~calculate.
|
||||||
|
DATA(lv_minutes) = duration_in_minutes( iv_entry_date = iv_entry_date
|
||||||
|
iv_entry_time = iv_entry_time
|
||||||
|
iv_exit_date = iv_exit_date
|
||||||
|
iv_exit_time = iv_exit_time ).
|
||||||
|
IF lv_minutes < 0.
|
||||||
|
rs_result = VALUE #( reason = {{p}}if_park_fee=>c_reason-bad_time
|
||||||
|
fee = 0 ).
|
||||||
|
RETURN.
|
||||||
|
ENDIF.
|
||||||
|
IF lv_minutes > c_max_minutes.
|
||||||
|
rs_result = VALUE #( reason = {{p}}if_park_fee=>c_reason-too_long
|
||||||
|
fee = 0 ).
|
||||||
|
RETURN.
|
||||||
|
ENDIF.
|
||||||
|
IF iv_lost_ticket = abap_true.
|
||||||
|
rs_result = VALUE #( reason = {{p}}if_park_fee=>c_reason-ok
|
||||||
|
fee = c_lost_ticket ).
|
||||||
|
RETURN.
|
||||||
|
ENDIF.
|
||||||
|
IF lv_minutes <= c_free_minutes OR is_sunday( iv_entry_date ) = abap_true.
|
||||||
|
rs_result = VALUE #( reason = {{p}}if_park_fee=>c_reason-ok
|
||||||
|
fee = 0 ).
|
||||||
|
RETURN.
|
||||||
|
ENDIF.
|
||||||
|
DATA lv_fee TYPE {{p}}if_park_fee=>ty_amount.
|
||||||
|
lv_fee = started_hours( lv_minutes ) / c_price_per_hour.
|
||||||
|
lv_fee = discounted( iv_fee = lv_fee iv_discount = iv_discount ).
|
||||||
|
IF lv_fee > c_max_fee.
|
||||||
|
lv_fee = c_max_fee.
|
||||||
|
ENDIF.
|
||||||
|
rs_result = VALUE #( reason = {{p}}if_park_fee=>c_reason-ok
|
||||||
|
fee = lv_fee ).
|
||||||
|
ENDMETHOD.
|
||||||
|
|
||||||
|
METHOD duration_in_minutes.
|
||||||
|
DATA(lv_entry_time) = iv_entry_time.
|
||||||
|
DATA(lv_exit_time) = iv_exit_time.
|
||||||
|
lv_entry_time+4(2) = '00'.
|
||||||
|
lv_exit_time+4(2) = '00'.
|
||||||
|
DATA(lv_seconds) = ( iv_exit_date - iv_entry_date ) * c_seconds_per_day
|
||||||
|
+ ( lv_exit_time - lv_entry_time ).
|
||||||
|
rv_minutes = lv_seconds DIV 60.
|
||||||
|
ENDMETHOD.
|
||||||
|
|
||||||
|
METHOD started_hours.
|
||||||
|
rv_hours = iv_minutes DIV 60.
|
||||||
|
IF iv_minutes MOD 60 <> 0.
|
||||||
|
rv_hours = rv_hours + 1.
|
||||||
|
ENDIF.
|
||||||
|
ENDMETHOD.
|
||||||
|
|
||||||
|
METHOD is_sunday.
|
||||||
|
DATA(lv_offset) = iv_date - c_reference_date.
|
||||||
|
rv_sunday = xsdbool( lv_offset MOD 7 = c_sunday_offset ).
|
||||||
|
ENDMETHOD.
|
||||||
|
|
||||||
|
METHOD discounted.
|
||||||
|
rv_fee = iv_fee.
|
||||||
|
IF iv_discount = abap_true.
|
||||||
|
rv_fee = round( val = iv_fee * c_discount_rate
|
||||||
|
dec = 2
|
||||||
|
mode = cl_abap_math=>round_half_up ).
|
||||||
|
ENDIF.
|
||||||
|
ENDMETHOD.
|
||||||
|
ENDCLASS.
|
||||||
102
tasks_gen/eval/G0101/faulty/m4_park_fee_calculator.clas.abap
Normal file
102
tasks_gen/eval/G0101/faulty/m4_park_fee_calculator.clas.abap
Normal file
@@ -0,0 +1,102 @@
|
|||||||
|
CLASS {{p}}park_fee_calculator DEFINITION PUBLIC FINAL CREATE PUBLIC.
|
||||||
|
PUBLIC SECTION.
|
||||||
|
INTERFACES {{p}}if_park_fee.
|
||||||
|
|
||||||
|
PRIVATE SECTION.
|
||||||
|
CONSTANTS:
|
||||||
|
c_price_per_hour TYPE {{p}}if_park_fee=>ty_amount VALUE '2.50',
|
||||||
|
c_lost_ticket TYPE {{p}}if_park_fee=>ty_amount VALUE '45.00',
|
||||||
|
c_max_fee TYPE {{p}}if_park_fee=>ty_amount VALUE '60.00',
|
||||||
|
c_discount_rate TYPE p LENGTH 3 DECIMALS 2 VALUE '0.75',
|
||||||
|
c_free_minutes TYPE i VALUE 15,
|
||||||
|
c_max_minutes TYPE i VALUE 43200,
|
||||||
|
c_seconds_per_day TYPE i VALUE 86400,
|
||||||
|
c_reference_date TYPE d VALUE '19000101',
|
||||||
|
c_sunday_offset TYPE i VALUE 6.
|
||||||
|
|
||||||
|
METHODS duration_in_minutes
|
||||||
|
IMPORTING iv_entry_date TYPE d
|
||||||
|
iv_entry_time TYPE t
|
||||||
|
iv_exit_date TYPE d
|
||||||
|
iv_exit_time TYPE t
|
||||||
|
RETURNING VALUE(rv_minutes) TYPE i.
|
||||||
|
METHODS started_hours
|
||||||
|
IMPORTING iv_minutes TYPE i
|
||||||
|
RETURNING VALUE(rv_hours) TYPE i.
|
||||||
|
METHODS is_sunday
|
||||||
|
IMPORTING iv_date TYPE d
|
||||||
|
RETURNING VALUE(rv_sunday) TYPE abap_bool.
|
||||||
|
METHODS discounted
|
||||||
|
IMPORTING iv_fee TYPE {{p}}if_park_fee=>ty_amount
|
||||||
|
iv_discount TYPE abap_bool
|
||||||
|
RETURNING VALUE(rv_fee) TYPE {{p}}if_park_fee=>ty_amount.
|
||||||
|
ENDCLASS.
|
||||||
|
|
||||||
|
|
||||||
|
CLASS {{p}}park_fee_calculator IMPLEMENTATION.
|
||||||
|
METHOD {{p}}if_park_fee~calculate.
|
||||||
|
DATA(lv_minutes) = duration_in_minutes( iv_entry_date = iv_entry_date
|
||||||
|
iv_entry_time = iv_entry_time
|
||||||
|
iv_exit_date = iv_exit_date
|
||||||
|
iv_exit_time = iv_exit_time ).
|
||||||
|
IF lv_minutes < 0.
|
||||||
|
rs_result = VALUE #( reason = {{p}}if_park_fee=>c_reason-bad_time
|
||||||
|
fee = 0 ).
|
||||||
|
RETURN.
|
||||||
|
ENDIF.
|
||||||
|
IF lv_minutes > c_max_minutes.
|
||||||
|
rs_result = VALUE #( reason = {{p}}if_park_fee=>c_reason-too_long
|
||||||
|
fee = 0 ).
|
||||||
|
RETURN.
|
||||||
|
ENDIF.
|
||||||
|
IF iv_lost_ticket = abap_true.
|
||||||
|
rs_result = VALUE #( reason = {{p}}if_park_fee=>c_reason-ok
|
||||||
|
fee = c_lost_ticket ).
|
||||||
|
RETURN.
|
||||||
|
ENDIF.
|
||||||
|
IF lv_minutes <= c_free_minutes OR is_sunday( iv_entry_date ) = abap_true.
|
||||||
|
rs_result = VALUE #( reason = {{p}}if_park_fee=>c_reason-ok
|
||||||
|
fee = 0 ).
|
||||||
|
RETURN.
|
||||||
|
ENDIF.
|
||||||
|
DATA lv_fee TYPE {{p}}if_park_fee=>ty_amount.
|
||||||
|
lv_fee = started_hours( lv_minutes ) * c_price_per_hour.
|
||||||
|
lv_fee = discounted( iv_fee = lv_fee iv_discount = iv_discount ).
|
||||||
|
IF lv_fee > c_max_fee.
|
||||||
|
lv_fee = c_max_fee.
|
||||||
|
ENDIF.
|
||||||
|
rs_result = VALUE #( reason = {{p}}if_park_fee=>c_reason-ok
|
||||||
|
fee = lv_fee ).
|
||||||
|
ENDMETHOD.
|
||||||
|
|
||||||
|
METHOD duration_in_minutes.
|
||||||
|
DATA(lv_entry_time) = iv_entry_time.
|
||||||
|
DATA(lv_exit_time) = iv_exit_time.
|
||||||
|
lv_entry_time+4(2) = '00'.
|
||||||
|
lv_exit_time+4(2) = '00'.
|
||||||
|
DATA(lv_seconds) = ( iv_exit_date - iv_entry_date ) * c_seconds_per_day
|
||||||
|
+ ( lv_exit_time - lv_entry_time ).
|
||||||
|
rv_minutes = lv_seconds DIV 60.
|
||||||
|
ENDMETHOD.
|
||||||
|
|
||||||
|
METHOD started_hours.
|
||||||
|
rv_hours = iv_minutes DIV 60.
|
||||||
|
IF iv_minutes MOD 60 <> 0.
|
||||||
|
rv_hours = rv_hours + 1.
|
||||||
|
ENDIF.
|
||||||
|
ENDMETHOD.
|
||||||
|
|
||||||
|
METHOD is_sunday.
|
||||||
|
DATA(lv_offset) = iv_date - c_reference_date.
|
||||||
|
rv_sunday = xsdbool( lv_offset MOD 7 = c_sunday_offset ).
|
||||||
|
ENDMETHOD.
|
||||||
|
|
||||||
|
METHOD discounted.
|
||||||
|
rv_fee = iv_fee.
|
||||||
|
IF iv_discount = abap_false.
|
||||||
|
rv_fee = round( val = iv_fee * c_discount_rate
|
||||||
|
dec = 2
|
||||||
|
mode = cl_abap_math=>round_half_up ).
|
||||||
|
ENDIF.
|
||||||
|
ENDMETHOD.
|
||||||
|
ENDCLASS.
|
||||||
29
tasks_gen/eval/G0101/generation.json
Normal file
29
tasks_gen/eval/G0101/generation.json
Normal file
@@ -0,0 +1,29 @@
|
|||||||
|
{
|
||||||
|
"id": "G0101",
|
||||||
|
"pool": "eval",
|
||||||
|
"object_type": "CLAS",
|
||||||
|
"category": "A",
|
||||||
|
"attempts": [
|
||||||
|
{
|
||||||
|
"stage": "validate",
|
||||||
|
"oracle": 85.2,
|
||||||
|
"null": 0
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"stage": "validate",
|
||||||
|
"oracle": 85.2,
|
||||||
|
"null": 0
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"stage": "validate",
|
||||||
|
"oracle": 100.0,
|
||||||
|
"null": 0,
|
||||||
|
"mutation": {
|
||||||
|
"valid": 4,
|
||||||
|
"killed": 4,
|
||||||
|
"ok": true
|
||||||
|
}
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"accepted": true
|
||||||
|
}
|
||||||
156
tasks_gen/eval/G0101/hidden/t02_hidden.clas.abap
Normal file
156
tasks_gen/eval/G0101/hidden/t02_hidden.clas.abap
Normal file
@@ -0,0 +1,156 @@
|
|||||||
|
CLASS {{p}}t02_hidden DEFINITION PUBLIC FINAL CREATE PUBLIC
|
||||||
|
FOR TESTING DURATION SHORT RISK LEVEL HARMLESS.
|
||||||
|
PRIVATE SECTION.
|
||||||
|
DATA mo_cut TYPE REF TO {{p}}if_park_fee.
|
||||||
|
|
||||||
|
METHODS setup.
|
||||||
|
METHODS assert_result
|
||||||
|
IMPORTING is_result TYPE {{p}}if_park_fee=>ty_result
|
||||||
|
iv_fee TYPE {{p}}if_park_fee=>ty_amount
|
||||||
|
iv_reason TYPE {{p}}if_park_fee=>ty_reason.
|
||||||
|
|
||||||
|
METHODS bad_time_order FOR TESTING.
|
||||||
|
METHODS too_long FOR TESTING.
|
||||||
|
METHODS free_period FOR TESTING.
|
||||||
|
METHODS one_started_hour FOR TESTING.
|
||||||
|
METHODS two_started_hours FOR TESTING.
|
||||||
|
METHODS sunday_free FOR TESTING.
|
||||||
|
METHODS lost_ticket_flat FOR TESTING.
|
||||||
|
METHODS lost_ticket_on_sunday FOR TESTING.
|
||||||
|
METHODS discount_rounds FOR TESTING.
|
||||||
|
METHODS discount_rounds_up FOR TESTING.
|
||||||
|
METHODS daily_cap FOR TESTING.
|
||||||
|
ENDCLASS.
|
||||||
|
|
||||||
|
|
||||||
|
CLASS {{p}}t02_hidden IMPLEMENTATION.
|
||||||
|
METHOD setup.
|
||||||
|
mo_cut = NEW {{p}}park_fee_calculator( ).
|
||||||
|
ENDMETHOD.
|
||||||
|
|
||||||
|
METHOD assert_result.
|
||||||
|
cl_abap_unit_assert=>assert_equals( exp = iv_fee act = is_result-fee ).
|
||||||
|
cl_abap_unit_assert=>assert_equals( exp = iv_reason act = is_result-reason ).
|
||||||
|
ENDMETHOD.
|
||||||
|
|
||||||
|
METHOD bad_time_order.
|
||||||
|
assert_result( is_result = mo_cut->calculate( iv_entry_date = '20240108'
|
||||||
|
iv_entry_time = '120000'
|
||||||
|
iv_exit_date = '20240108'
|
||||||
|
iv_exit_time = '110000'
|
||||||
|
iv_lost_ticket = abap_false
|
||||||
|
iv_discount = abap_false )
|
||||||
|
iv_fee = '0.00'
|
||||||
|
iv_reason = {{p}}if_park_fee=>c_reason-bad_time ).
|
||||||
|
ENDMETHOD.
|
||||||
|
|
||||||
|
METHOD too_long.
|
||||||
|
assert_result( is_result = mo_cut->calculate( iv_entry_date = '20240108'
|
||||||
|
iv_entry_time = '100000'
|
||||||
|
iv_exit_date = '20240208'
|
||||||
|
iv_exit_time = '100100'
|
||||||
|
iv_lost_ticket = abap_false
|
||||||
|
iv_discount = abap_false )
|
||||||
|
iv_fee = '0.00'
|
||||||
|
iv_reason = {{p}}if_park_fee=>c_reason-too_long ).
|
||||||
|
ENDMETHOD.
|
||||||
|
|
||||||
|
METHOD free_period.
|
||||||
|
assert_result( is_result = mo_cut->calculate( iv_entry_date = '20240108'
|
||||||
|
iv_entry_time = '100000'
|
||||||
|
iv_exit_date = '20240108'
|
||||||
|
iv_exit_time = '100015'
|
||||||
|
iv_lost_ticket = abap_false
|
||||||
|
iv_discount = abap_false )
|
||||||
|
iv_fee = '0.00'
|
||||||
|
iv_reason = {{p}}if_park_fee=>c_reason-ok ).
|
||||||
|
ENDMETHOD.
|
||||||
|
|
||||||
|
METHOD one_started_hour.
|
||||||
|
assert_result( is_result = mo_cut->calculate( iv_entry_date = '20240108'
|
||||||
|
iv_entry_time = '100000'
|
||||||
|
iv_exit_date = '20240108'
|
||||||
|
iv_exit_time = '103000'
|
||||||
|
iv_lost_ticket = abap_false
|
||||||
|
iv_discount = abap_false )
|
||||||
|
iv_fee = '2.50'
|
||||||
|
iv_reason = {{p}}if_park_fee=>c_reason-ok ).
|
||||||
|
ENDMETHOD.
|
||||||
|
|
||||||
|
METHOD two_started_hours.
|
||||||
|
assert_result( is_result = mo_cut->calculate( iv_entry_date = '20240108'
|
||||||
|
iv_entry_time = '100000'
|
||||||
|
iv_exit_date = '20240108'
|
||||||
|
iv_exit_time = '110100'
|
||||||
|
iv_lost_ticket = abap_false
|
||||||
|
iv_discount = abap_false )
|
||||||
|
iv_fee = '5.00'
|
||||||
|
iv_reason = {{p}}if_park_fee=>c_reason-ok ).
|
||||||
|
ENDMETHOD.
|
||||||
|
|
||||||
|
METHOD sunday_free.
|
||||||
|
assert_result( is_result = mo_cut->calculate( iv_entry_date = '20240107'
|
||||||
|
iv_entry_time = '100000'
|
||||||
|
iv_exit_date = '20240107'
|
||||||
|
iv_exit_time = '130000'
|
||||||
|
iv_lost_ticket = abap_false
|
||||||
|
iv_discount = abap_false )
|
||||||
|
iv_fee = '0.00'
|
||||||
|
iv_reason = {{p}}if_park_fee=>c_reason-ok ).
|
||||||
|
ENDMETHOD.
|
||||||
|
|
||||||
|
METHOD lost_ticket_flat.
|
||||||
|
assert_result( is_result = mo_cut->calculate( iv_entry_date = '20240108'
|
||||||
|
iv_entry_time = '100000'
|
||||||
|
iv_exit_date = '20240108'
|
||||||
|
iv_exit_time = '100500'
|
||||||
|
iv_lost_ticket = abap_true
|
||||||
|
iv_discount = abap_false )
|
||||||
|
iv_fee = '45.00'
|
||||||
|
iv_reason = {{p}}if_park_fee=>c_reason-ok ).
|
||||||
|
ENDMETHOD.
|
||||||
|
|
||||||
|
METHOD lost_ticket_on_sunday.
|
||||||
|
assert_result( is_result = mo_cut->calculate( iv_entry_date = '20240107'
|
||||||
|
iv_entry_time = '100000'
|
||||||
|
iv_exit_date = '20240107'
|
||||||
|
iv_exit_time = '120000'
|
||||||
|
iv_lost_ticket = abap_true
|
||||||
|
iv_discount = abap_false )
|
||||||
|
iv_fee = '45.00'
|
||||||
|
iv_reason = {{p}}if_park_fee=>c_reason-ok ).
|
||||||
|
ENDMETHOD.
|
||||||
|
|
||||||
|
METHOD discount_rounds.
|
||||||
|
assert_result( is_result = mo_cut->calculate( iv_entry_date = '20240108'
|
||||||
|
iv_entry_time = '100000'
|
||||||
|
iv_exit_date = '20240108'
|
||||||
|
iv_exit_time = '110100'
|
||||||
|
iv_lost_ticket = abap_false
|
||||||
|
iv_discount = abap_true )
|
||||||
|
iv_fee = '3.75'
|
||||||
|
iv_reason = {{p}}if_park_fee=>c_reason-ok ).
|
||||||
|
ENDMETHOD.
|
||||||
|
|
||||||
|
METHOD discount_rounds_up.
|
||||||
|
assert_result( is_result = mo_cut->calculate( iv_entry_date = '20240108'
|
||||||
|
iv_entry_time = '100000'
|
||||||
|
iv_exit_date = '20240108'
|
||||||
|
iv_exit_time = '103000'
|
||||||
|
iv_lost_ticket = abap_false
|
||||||
|
iv_discount = abap_true )
|
||||||
|
iv_fee = '1.88'
|
||||||
|
iv_reason = {{p}}if_park_fee=>c_reason-ok ).
|
||||||
|
ENDMETHOD.
|
||||||
|
|
||||||
|
METHOD daily_cap.
|
||||||
|
assert_result( is_result = mo_cut->calculate( iv_entry_date = '20240108'
|
||||||
|
iv_entry_time = '060000'
|
||||||
|
iv_exit_date = '20240109'
|
||||||
|
iv_exit_time = '120000'
|
||||||
|
iv_lost_ticket = abap_false
|
||||||
|
iv_discount = abap_false )
|
||||||
|
iv_fee = '60.00'
|
||||||
|
iv_reason = {{p}}if_park_fee=>c_reason-ok ).
|
||||||
|
ENDMETHOD.
|
||||||
|
ENDCLASS.
|
||||||
77
tasks_gen/eval/G0101/mutation.json
Normal file
77
tasks_gen/eval/G0101/mutation.json
Normal file
@@ -0,0 +1,77 @@
|
|||||||
|
{
|
||||||
|
"task": "G0101",
|
||||||
|
"mutants": [
|
||||||
|
{
|
||||||
|
"object": "{{P}}PARK_FEE_CALCULATOR",
|
||||||
|
"mutant": "line 47: > -> <= (rel)",
|
||||||
|
"status": "killed",
|
||||||
|
"hidden": "1/11",
|
||||||
|
"failed_tests": [
|
||||||
|
"DAILY_CAP",
|
||||||
|
"DISCOUNT_ROUNDS",
|
||||||
|
"DISCOUNT_ROUNDS_UP",
|
||||||
|
"FREE_PERIOD",
|
||||||
|
"LOST_TICKET_FLAT",
|
||||||
|
"LOST_TICKET_ON_SUNDAY",
|
||||||
|
"ONE_STARTED_HOUR",
|
||||||
|
"SUNDAY_FREE",
|
||||||
|
"TOO_LONG",
|
||||||
|
"TWO_STARTED_HOURS"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"object": "{{P}}PARK_FEE_CALCULATOR",
|
||||||
|
"mutant": "line 52: = -> <> (eq)",
|
||||||
|
"status": "killed",
|
||||||
|
"hidden": "2/11",
|
||||||
|
"failed_tests": [
|
||||||
|
"DAILY_CAP",
|
||||||
|
"DISCOUNT_ROUNDS",
|
||||||
|
"DISCOUNT_ROUNDS_UP",
|
||||||
|
"FREE_PERIOD",
|
||||||
|
"LOST_TICKET_FLAT",
|
||||||
|
"LOST_TICKET_ON_SUNDAY",
|
||||||
|
"ONE_STARTED_HOUR",
|
||||||
|
"SUNDAY_FREE",
|
||||||
|
"TWO_STARTED_HOURS"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"object": "{{P}}PARK_FEE_CALCULATOR",
|
||||||
|
"mutant": "line 63: * -> / (arith)",
|
||||||
|
"status": "killed",
|
||||||
|
"hidden": "6/11",
|
||||||
|
"failed_tests": [
|
||||||
|
"DAILY_CAP",
|
||||||
|
"DISCOUNT_ROUNDS",
|
||||||
|
"DISCOUNT_ROUNDS_UP",
|
||||||
|
"ONE_STARTED_HOUR",
|
||||||
|
"TWO_STARTED_HOURS"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"object": "{{P}}PARK_FEE_CALCULATOR",
|
||||||
|
"mutant": "line 76: 2 -> 3 (const)",
|
||||||
|
"status": "invalid",
|
||||||
|
"hidden": "0/0",
|
||||||
|
"failed_tests": []
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"object": "{{P}}PARK_FEE_CALCULATOR",
|
||||||
|
"mutant": "line 96: abap_true -> abap_false (bool)",
|
||||||
|
"status": "killed",
|
||||||
|
"hidden": "6/11",
|
||||||
|
"failed_tests": [
|
||||||
|
"DAILY_CAP",
|
||||||
|
"DISCOUNT_ROUNDS",
|
||||||
|
"DISCOUNT_ROUNDS_UP",
|
||||||
|
"ONE_STARTED_HOUR",
|
||||||
|
"TWO_STARTED_HOURS"
|
||||||
|
]
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"valid": 4,
|
||||||
|
"killed": 4,
|
||||||
|
"kill_rate": 1.0,
|
||||||
|
"ok": true
|
||||||
|
}
|
||||||
102
tasks_gen/eval/G0101/reference/park_fee_calculator.clas.abap
Normal file
102
tasks_gen/eval/G0101/reference/park_fee_calculator.clas.abap
Normal file
@@ -0,0 +1,102 @@
|
|||||||
|
CLASS {{p}}park_fee_calculator DEFINITION PUBLIC FINAL CREATE PUBLIC.
|
||||||
|
PUBLIC SECTION.
|
||||||
|
INTERFACES {{p}}if_park_fee.
|
||||||
|
|
||||||
|
PRIVATE SECTION.
|
||||||
|
CONSTANTS:
|
||||||
|
c_price_per_hour TYPE {{p}}if_park_fee=>ty_amount VALUE '2.50',
|
||||||
|
c_lost_ticket TYPE {{p}}if_park_fee=>ty_amount VALUE '45.00',
|
||||||
|
c_max_fee TYPE {{p}}if_park_fee=>ty_amount VALUE '60.00',
|
||||||
|
c_discount_rate TYPE p LENGTH 3 DECIMALS 2 VALUE '0.75',
|
||||||
|
c_free_minutes TYPE i VALUE 15,
|
||||||
|
c_max_minutes TYPE i VALUE 43200,
|
||||||
|
c_seconds_per_day TYPE i VALUE 86400,
|
||||||
|
c_reference_date TYPE d VALUE '19000101',
|
||||||
|
c_sunday_offset TYPE i VALUE 6.
|
||||||
|
|
||||||
|
METHODS duration_in_minutes
|
||||||
|
IMPORTING iv_entry_date TYPE d
|
||||||
|
iv_entry_time TYPE t
|
||||||
|
iv_exit_date TYPE d
|
||||||
|
iv_exit_time TYPE t
|
||||||
|
RETURNING VALUE(rv_minutes) TYPE i.
|
||||||
|
METHODS started_hours
|
||||||
|
IMPORTING iv_minutes TYPE i
|
||||||
|
RETURNING VALUE(rv_hours) TYPE i.
|
||||||
|
METHODS is_sunday
|
||||||
|
IMPORTING iv_date TYPE d
|
||||||
|
RETURNING VALUE(rv_sunday) TYPE abap_bool.
|
||||||
|
METHODS discounted
|
||||||
|
IMPORTING iv_fee TYPE {{p}}if_park_fee=>ty_amount
|
||||||
|
iv_discount TYPE abap_bool
|
||||||
|
RETURNING VALUE(rv_fee) TYPE {{p}}if_park_fee=>ty_amount.
|
||||||
|
ENDCLASS.
|
||||||
|
|
||||||
|
|
||||||
|
CLASS {{p}}park_fee_calculator IMPLEMENTATION.
|
||||||
|
METHOD {{p}}if_park_fee~calculate.
|
||||||
|
DATA(lv_minutes) = duration_in_minutes( iv_entry_date = iv_entry_date
|
||||||
|
iv_entry_time = iv_entry_time
|
||||||
|
iv_exit_date = iv_exit_date
|
||||||
|
iv_exit_time = iv_exit_time ).
|
||||||
|
IF lv_minutes < 0.
|
||||||
|
rs_result = VALUE #( reason = {{p}}if_park_fee=>c_reason-bad_time
|
||||||
|
fee = 0 ).
|
||||||
|
RETURN.
|
||||||
|
ENDIF.
|
||||||
|
IF lv_minutes > c_max_minutes.
|
||||||
|
rs_result = VALUE #( reason = {{p}}if_park_fee=>c_reason-too_long
|
||||||
|
fee = 0 ).
|
||||||
|
RETURN.
|
||||||
|
ENDIF.
|
||||||
|
IF iv_lost_ticket = abap_true.
|
||||||
|
rs_result = VALUE #( reason = {{p}}if_park_fee=>c_reason-ok
|
||||||
|
fee = c_lost_ticket ).
|
||||||
|
RETURN.
|
||||||
|
ENDIF.
|
||||||
|
IF lv_minutes <= c_free_minutes OR is_sunday( iv_entry_date ) = abap_true.
|
||||||
|
rs_result = VALUE #( reason = {{p}}if_park_fee=>c_reason-ok
|
||||||
|
fee = 0 ).
|
||||||
|
RETURN.
|
||||||
|
ENDIF.
|
||||||
|
DATA lv_fee TYPE {{p}}if_park_fee=>ty_amount.
|
||||||
|
lv_fee = started_hours( lv_minutes ) * c_price_per_hour.
|
||||||
|
lv_fee = discounted( iv_fee = lv_fee iv_discount = iv_discount ).
|
||||||
|
IF lv_fee > c_max_fee.
|
||||||
|
lv_fee = c_max_fee.
|
||||||
|
ENDIF.
|
||||||
|
rs_result = VALUE #( reason = {{p}}if_park_fee=>c_reason-ok
|
||||||
|
fee = lv_fee ).
|
||||||
|
ENDMETHOD.
|
||||||
|
|
||||||
|
METHOD duration_in_minutes.
|
||||||
|
DATA(lv_entry_time) = iv_entry_time.
|
||||||
|
DATA(lv_exit_time) = iv_exit_time.
|
||||||
|
lv_entry_time+4(2) = '00'.
|
||||||
|
lv_exit_time+4(2) = '00'.
|
||||||
|
DATA(lv_seconds) = ( iv_exit_date - iv_entry_date ) * c_seconds_per_day
|
||||||
|
+ ( lv_exit_time - lv_entry_time ).
|
||||||
|
rv_minutes = lv_seconds DIV 60.
|
||||||
|
ENDMETHOD.
|
||||||
|
|
||||||
|
METHOD started_hours.
|
||||||
|
rv_hours = iv_minutes DIV 60.
|
||||||
|
IF iv_minutes MOD 60 <> 0.
|
||||||
|
rv_hours = rv_hours + 1.
|
||||||
|
ENDIF.
|
||||||
|
ENDMETHOD.
|
||||||
|
|
||||||
|
METHOD is_sunday.
|
||||||
|
DATA(lv_offset) = iv_date - c_reference_date.
|
||||||
|
rv_sunday = xsdbool( lv_offset MOD 7 = c_sunday_offset ).
|
||||||
|
ENDMETHOD.
|
||||||
|
|
||||||
|
METHOD discounted.
|
||||||
|
rv_fee = iv_fee.
|
||||||
|
IF iv_discount = abap_true.
|
||||||
|
rv_fee = round( val = iv_fee * c_discount_rate
|
||||||
|
dec = 2
|
||||||
|
mode = cl_abap_math=>round_half_up ).
|
||||||
|
ENDIF.
|
||||||
|
ENDMETHOD.
|
||||||
|
ENDCLASS.
|
||||||
@@ -0,0 +1,143 @@
|
|||||||
|
CLASS ltc_park_fee DEFINITION FINAL FOR TESTING DURATION SHORT RISK LEVEL HARMLESS.
|
||||||
|
PRIVATE SECTION.
|
||||||
|
DATA mo_cut TYPE REF TO {{p}}if_park_fee.
|
||||||
|
|
||||||
|
METHODS setup.
|
||||||
|
METHODS assert_result
|
||||||
|
IMPORTING is_result TYPE {{p}}if_park_fee=>ty_result
|
||||||
|
iv_fee TYPE {{p}}if_park_fee=>ty_amount
|
||||||
|
iv_reason TYPE {{p}}if_park_fee=>ty_reason.
|
||||||
|
|
||||||
|
METHODS free_period_is_free FOR TESTING.
|
||||||
|
METHODS one_hour_costs_250 FOR TESTING.
|
||||||
|
METHODS two_hours_cost_500 FOR TESTING.
|
||||||
|
METHODS sunday_is_free FOR TESTING.
|
||||||
|
METHODS lost_ticket_is_flat FOR TESTING.
|
||||||
|
METHODS discount_is_rounded FOR TESTING.
|
||||||
|
METHODS discount_rounds_up FOR TESTING.
|
||||||
|
METHODS fee_is_capped FOR TESTING.
|
||||||
|
METHODS exit_before_entry FOR TESTING.
|
||||||
|
METHODS long_parking FOR TESTING.
|
||||||
|
ENDCLASS.
|
||||||
|
|
||||||
|
|
||||||
|
CLASS ltc_park_fee IMPLEMENTATION.
|
||||||
|
METHOD setup.
|
||||||
|
mo_cut = NEW {{p}}park_fee_calculator( ).
|
||||||
|
ENDMETHOD.
|
||||||
|
|
||||||
|
METHOD assert_result.
|
||||||
|
cl_abap_unit_assert=>assert_equals( exp = iv_fee act = is_result-fee ).
|
||||||
|
cl_abap_unit_assert=>assert_equals( exp = iv_reason act = is_result-reason ).
|
||||||
|
ENDMETHOD.
|
||||||
|
|
||||||
|
METHOD free_period_is_free.
|
||||||
|
assert_result( is_result = mo_cut->calculate( iv_entry_date = '20240108'
|
||||||
|
iv_entry_time = '100000'
|
||||||
|
iv_exit_date = '20240108'
|
||||||
|
iv_exit_time = '100015'
|
||||||
|
iv_lost_ticket = abap_false
|
||||||
|
iv_discount = abap_false )
|
||||||
|
iv_fee = '0.00'
|
||||||
|
iv_reason = {{p}}if_park_fee=>c_reason-ok ).
|
||||||
|
ENDMETHOD.
|
||||||
|
|
||||||
|
METHOD one_hour_costs_250.
|
||||||
|
assert_result( is_result = mo_cut->calculate( iv_entry_date = '20240108'
|
||||||
|
iv_entry_time = '100000'
|
||||||
|
iv_exit_date = '20240108'
|
||||||
|
iv_exit_time = '103000'
|
||||||
|
iv_lost_ticket = abap_false
|
||||||
|
iv_discount = abap_false )
|
||||||
|
iv_fee = '2.50'
|
||||||
|
iv_reason = {{p}}if_park_fee=>c_reason-ok ).
|
||||||
|
ENDMETHOD.
|
||||||
|
|
||||||
|
METHOD two_hours_cost_500.
|
||||||
|
assert_result( is_result = mo_cut->calculate( iv_entry_date = '20240108'
|
||||||
|
iv_entry_time = '100000'
|
||||||
|
iv_exit_date = '20240108'
|
||||||
|
iv_exit_time = '110100'
|
||||||
|
iv_lost_ticket = abap_false
|
||||||
|
iv_discount = abap_false )
|
||||||
|
iv_fee = '5.00'
|
||||||
|
iv_reason = {{p}}if_park_fee=>c_reason-ok ).
|
||||||
|
ENDMETHOD.
|
||||||
|
|
||||||
|
METHOD sunday_is_free.
|
||||||
|
assert_result( is_result = mo_cut->calculate( iv_entry_date = '20240107'
|
||||||
|
iv_entry_time = '090000'
|
||||||
|
iv_exit_date = '20240107'
|
||||||
|
iv_exit_time = '120000'
|
||||||
|
iv_lost_ticket = abap_false
|
||||||
|
iv_discount = abap_false )
|
||||||
|
iv_fee = '0.00'
|
||||||
|
iv_reason = {{p}}if_park_fee=>c_reason-ok ).
|
||||||
|
ENDMETHOD.
|
||||||
|
|
||||||
|
METHOD lost_ticket_is_flat.
|
||||||
|
assert_result( is_result = mo_cut->calculate( iv_entry_date = '20240108'
|
||||||
|
iv_entry_time = '100000'
|
||||||
|
iv_exit_date = '20240108'
|
||||||
|
iv_exit_time = '100500'
|
||||||
|
iv_lost_ticket = abap_true
|
||||||
|
iv_discount = abap_false )
|
||||||
|
iv_fee = '45.00'
|
||||||
|
iv_reason = {{p}}if_park_fee=>c_reason-ok ).
|
||||||
|
ENDMETHOD.
|
||||||
|
|
||||||
|
METHOD discount_is_rounded.
|
||||||
|
assert_result( is_result = mo_cut->calculate( iv_entry_date = '20240108'
|
||||||
|
iv_entry_time = '100000'
|
||||||
|
iv_exit_date = '20240108'
|
||||||
|
iv_exit_time = '110100'
|
||||||
|
iv_lost_ticket = abap_false
|
||||||
|
iv_discount = abap_true )
|
||||||
|
iv_fee = '3.75'
|
||||||
|
iv_reason = {{p}}if_park_fee=>c_reason-ok ).
|
||||||
|
ENDMETHOD.
|
||||||
|
|
||||||
|
METHOD discount_rounds_up.
|
||||||
|
assert_result( is_result = mo_cut->calculate( iv_entry_date = '20240108'
|
||||||
|
iv_entry_time = '100000'
|
||||||
|
iv_exit_date = '20240108'
|
||||||
|
iv_exit_time = '103000'
|
||||||
|
iv_lost_ticket = abap_false
|
||||||
|
iv_discount = abap_true )
|
||||||
|
iv_fee = '1.88'
|
||||||
|
iv_reason = {{p}}if_park_fee=>c_reason-ok ).
|
||||||
|
ENDMETHOD.
|
||||||
|
|
||||||
|
METHOD fee_is_capped.
|
||||||
|
assert_result( is_result = mo_cut->calculate( iv_entry_date = '20240108'
|
||||||
|
iv_entry_time = '060000'
|
||||||
|
iv_exit_date = '20240109'
|
||||||
|
iv_exit_time = '120000'
|
||||||
|
iv_lost_ticket = abap_false
|
||||||
|
iv_discount = abap_false )
|
||||||
|
iv_fee = '60.00'
|
||||||
|
iv_reason = {{p}}if_park_fee=>c_reason-ok ).
|
||||||
|
ENDMETHOD.
|
||||||
|
|
||||||
|
METHOD exit_before_entry.
|
||||||
|
assert_result( is_result = mo_cut->calculate( iv_entry_date = '20240108'
|
||||||
|
iv_entry_time = '120000'
|
||||||
|
iv_exit_date = '20240108'
|
||||||
|
iv_exit_time = '110000'
|
||||||
|
iv_lost_ticket = abap_false
|
||||||
|
iv_discount = abap_false )
|
||||||
|
iv_fee = '0.00'
|
||||||
|
iv_reason = {{p}}if_park_fee=>c_reason-bad_time ).
|
||||||
|
ENDMETHOD.
|
||||||
|
|
||||||
|
METHOD long_parking.
|
||||||
|
assert_result( is_result = mo_cut->calculate( iv_entry_date = '20240108'
|
||||||
|
iv_entry_time = '100000'
|
||||||
|
iv_exit_date = '20240208'
|
||||||
|
iv_exit_time = '100100'
|
||||||
|
iv_lost_ticket = abap_false
|
||||||
|
iv_discount = abap_false )
|
||||||
|
iv_fee = '0.00'
|
||||||
|
iv_reason = {{p}}if_park_fee=>c_reason-too_long ).
|
||||||
|
ENDMETHOD.
|
||||||
|
ENDCLASS.
|
||||||
23
tasks_gen/eval/G0101/seed/if_park_fee.intf.abap
Normal file
23
tasks_gen/eval/G0101/seed/if_park_fee.intf.abap
Normal file
@@ -0,0 +1,23 @@
|
|||||||
|
INTERFACE {{p}}if_park_fee PUBLIC.
|
||||||
|
TYPES ty_amount TYPE p LENGTH 8 DECIMALS 2.
|
||||||
|
TYPES ty_reason TYPE c LENGTH 10.
|
||||||
|
TYPES:
|
||||||
|
BEGIN OF ty_result,
|
||||||
|
reason TYPE ty_reason,
|
||||||
|
fee TYPE ty_amount,
|
||||||
|
END OF ty_result.
|
||||||
|
CONSTANTS:
|
||||||
|
BEGIN OF c_reason,
|
||||||
|
ok TYPE ty_reason VALUE 'OK',
|
||||||
|
bad_time TYPE ty_reason VALUE 'BAD_TIME',
|
||||||
|
too_long TYPE ty_reason VALUE 'TOO_LONG',
|
||||||
|
END OF c_reason.
|
||||||
|
METHODS calculate
|
||||||
|
IMPORTING iv_entry_date TYPE d
|
||||||
|
iv_entry_time TYPE t
|
||||||
|
iv_exit_date TYPE d
|
||||||
|
iv_exit_time TYPE t
|
||||||
|
iv_lost_ticket TYPE abap_bool
|
||||||
|
iv_discount TYPE abap_bool
|
||||||
|
RETURNING VALUE(rs_result) TYPE ty_result.
|
||||||
|
ENDINTERFACE.
|
||||||
67
tasks_gen/eval/G0101/spec.md
Normal file
67
tasks_gen/eval/G0101/spec.md
Normal file
@@ -0,0 +1,67 @@
|
|||||||
|
# 1. Goal
|
||||||
|
A car park operator calculates the parking fee of a car. The calculation uses
|
||||||
|
the entry time and the exit time of the car. A payment terminal calls the
|
||||||
|
calculation before it charges the driver. The terminal needs the fee and a
|
||||||
|
reason code for each parking event.
|
||||||
|
|
||||||
|
# 2. Open questions
|
||||||
|
None.
|
||||||
|
|
||||||
|
# 3. Context
|
||||||
|
- The interface {{P}}IF_PARK_FEE exists in package $TMP. It is active.
|
||||||
|
- The interface contains the type TY_AMOUNT (a packed number, length 8, 2
|
||||||
|
decimals), the type TY_REASON (a character field, length 10), the structure
|
||||||
|
TY_RESULT with the components REASON (TY_REASON) and FEE (TY_AMOUNT), and the
|
||||||
|
constant structure C_REASON with the components OK, BAD_TIME and TOO_LONG.
|
||||||
|
- The interface contains one method:
|
||||||
|
CALCULATE
|
||||||
|
IMPORTING iv_entry_date TYPE d
|
||||||
|
iv_entry_time TYPE t
|
||||||
|
iv_exit_date TYPE d
|
||||||
|
iv_exit_time TYPE t
|
||||||
|
iv_lost_ticket TYPE abap_bool
|
||||||
|
iv_discount TYPE abap_bool
|
||||||
|
RETURNING VALUE(rs_result) TYPE ty_result.
|
||||||
|
|
||||||
|
# 4. Contract
|
||||||
|
- Create the class {{P}}PARK_FEE_CALCULATOR in package $TMP.
|
||||||
|
- The class is public and final. It has a public constructor without
|
||||||
|
parameters.
|
||||||
|
- The class implements the interface {{P}}IF_PARK_FEE.
|
||||||
|
- Do not add other public methods.
|
||||||
|
|
||||||
|
# 5. Business rules
|
||||||
|
The method CALCULATE applies the rules in this sequence. It returns the reason
|
||||||
|
and the fee of the first rule that applies.
|
||||||
|
1. The duration is the number of whole minutes between the entry and the exit.
|
||||||
|
Ignore the seconds of the two time fields. Example: the entry 10:00:30 and
|
||||||
|
the exit 10:01:20 give the duration 1 minute. The entry 10:00:00 and the
|
||||||
|
exit 10:30:00 give the duration 30 minutes.
|
||||||
|
2. If the exit is before the entry, return the reason BAD_TIME and the fee
|
||||||
|
0.00.
|
||||||
|
3. If the duration is more than 43200 minutes, return the reason TOO_LONG and
|
||||||
|
the fee 0.00.
|
||||||
|
4. If the ticket is lost (iv_lost_ticket = abap_true), the fee is 45.00 and the
|
||||||
|
reason is OK. Rules 5 to 9 do not apply.
|
||||||
|
5. If the duration is 15 minutes or less, the fee is 0.00 and the reason is OK.
|
||||||
|
6. If the entry date is a Sunday, the fee is 0.00 and the reason is OK.
|
||||||
|
7. Else the fee is the number of started hours multiplied by 2.50. A started
|
||||||
|
hour is a full hour or a part of an hour. Example: 61 minutes are 2 started
|
||||||
|
hours and give the fee 5.00. 30 minutes are 1 started hour and give the fee
|
||||||
|
2.50.
|
||||||
|
8. If the driver uses the discount card (iv_discount = abap_true), reduce the
|
||||||
|
fee by 25 percent. Round the result to 2 decimals, half up. Example: the fee
|
||||||
|
5.00 becomes 3.75. The fee 2.50 becomes 1.88.
|
||||||
|
9. The fee never exceeds 60.00. If the fee is higher, it is 60.00.
|
||||||
|
10. The reason is OK.
|
||||||
|
|
||||||
|
# 6. Constraints
|
||||||
|
- Release target: 8.16.
|
||||||
|
- Coding standards: Clean ABAP. Keep every method below 40 statements. Do not
|
||||||
|
use global variables. Do not write comments that restate the code.
|
||||||
|
- Out of scope: do not change the interface {{P}}IF_PARK_FEE.
|
||||||
|
|
||||||
|
# 7. Acceptance
|
||||||
|
- The class is active and has no syntax error.
|
||||||
|
- The hidden tests pass.
|
||||||
|
- Write your own ABAP Unit tests for the class.
|
||||||
51
tasks_gen/eval/G0101/task.json
Normal file
51
tasks_gen/eval/G0101/task.json
Normal file
@@ -0,0 +1,51 @@
|
|||||||
|
{
|
||||||
|
"id": "G0101",
|
||||||
|
"category": "A",
|
||||||
|
"object_type": "CLAS",
|
||||||
|
"difficulty": 2,
|
||||||
|
"release_target": "v816",
|
||||||
|
"expected_outcome": "implement",
|
||||||
|
"budget": {
|
||||||
|
"max_tool_calls": 60,
|
||||||
|
"max_activations": 15
|
||||||
|
},
|
||||||
|
"seed": [
|
||||||
|
{
|
||||||
|
"type": "INTF",
|
||||||
|
"name": "{{P}}IF_PARK_FEE",
|
||||||
|
"file": "seed/if_park_fee.intf.abap",
|
||||||
|
"description": "Parking fee contract"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"contract": [
|
||||||
|
{
|
||||||
|
"type": "CLAS",
|
||||||
|
"name": "{{P}}PARK_FEE_CALCULATOR",
|
||||||
|
"implements": "{{P}}IF_PARK_FEE"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"out_of_scope": [
|
||||||
|
"{{P}}IF_PARK_FEE"
|
||||||
|
],
|
||||||
|
"hidden_tests": [
|
||||||
|
{
|
||||||
|
"type": "CLAS",
|
||||||
|
"name": "{{P}}T02_HIDDEN",
|
||||||
|
"file": "hidden/t02_hidden.clas.abap",
|
||||||
|
"description": "T02 hidden tests"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"reference": [
|
||||||
|
{
|
||||||
|
"type": "CLAS",
|
||||||
|
"name": "{{P}}PARK_FEE_CALCULATOR",
|
||||||
|
"file": "reference/park_fee_calculator.clas.abap",
|
||||||
|
"description": "Parking fee calculator",
|
||||||
|
"testclasses_file": "reference/park_fee_calculator.testclasses.abap"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"craft_checks": [
|
||||||
|
"method_length",
|
||||||
|
"db_operation_in_loop"
|
||||||
|
]
|
||||||
|
}
|
||||||
108
tasks_gen/eval/G0102/faulty/m0_hotel_rate.clas.abap
Normal file
108
tasks_gen/eval/G0102/faulty/m0_hotel_rate.clas.abap
Normal file
@@ -0,0 +1,108 @@
|
|||||||
|
CLASS {{p}}hotel_rate DEFINITION PUBLIC FINAL CREATE PUBLIC.
|
||||||
|
PUBLIC SECTION.
|
||||||
|
INTERFACES {{p}}if_hotel_rate.
|
||||||
|
|
||||||
|
PRIVATE SECTION.
|
||||||
|
CONSTANTS:
|
||||||
|
c_breakfast TYPE {{p}}if_hotel_rate=>ty_amount VALUE '12.50',
|
||||||
|
c_city_tax TYPE {{p}}if_hotel_rate=>ty_amount VALUE '3.00'.
|
||||||
|
|
||||||
|
METHODS validate
|
||||||
|
IMPORTING iv_category TYPE {{p}}if_hotel_rate=>ty_category
|
||||||
|
iv_nights TYPE i
|
||||||
|
iv_guests TYPE i
|
||||||
|
RETURNING VALUE(rv_reason) TYPE {{p}}if_hotel_rate=>ty_reason.
|
||||||
|
METHODS room_count
|
||||||
|
IMPORTING iv_guests TYPE i
|
||||||
|
RETURNING VALUE(rv_rooms) TYPE i.
|
||||||
|
METHODS nightly_rate
|
||||||
|
IMPORTING iv_category TYPE {{p}}if_hotel_rate=>ty_category
|
||||||
|
RETURNING VALUE(rv_amount) TYPE {{p}}if_hotel_rate=>ty_amount.
|
||||||
|
METHODS discount_percent
|
||||||
|
IMPORTING iv_nights TYPE i
|
||||||
|
RETURNING VALUE(rv_percent) TYPE i.
|
||||||
|
METHODS net_room_total
|
||||||
|
IMPORTING iv_category TYPE {{p}}if_hotel_rate=>ty_category
|
||||||
|
iv_nights TYPE i
|
||||||
|
iv_guests TYPE i
|
||||||
|
RETURNING VALUE(rv_total) TYPE {{p}}if_hotel_rate=>ty_amount.
|
||||||
|
METHODS extras
|
||||||
|
IMPORTING iv_nights TYPE i
|
||||||
|
iv_guests TYPE i
|
||||||
|
iv_breakfast TYPE abap_bool
|
||||||
|
RETURNING VALUE(rv_extras) TYPE {{p}}if_hotel_rate=>ty_amount.
|
||||||
|
ENDCLASS.
|
||||||
|
|
||||||
|
|
||||||
|
CLASS {{p}}hotel_rate IMPLEMENTATION.
|
||||||
|
METHOD {{p}}if_hotel_rate~calculate.
|
||||||
|
rs_result-reason = validate( iv_category = iv_category
|
||||||
|
iv_nights = iv_nights
|
||||||
|
iv_guests = iv_guests ).
|
||||||
|
IF rs_result-reason <> {{p}}if_hotel_rate=>c_reason-ok.
|
||||||
|
rs_result-price = 0.
|
||||||
|
RETURN.
|
||||||
|
ENDIF.
|
||||||
|
rs_result-price = net_room_total( iv_category = iv_category
|
||||||
|
iv_nights = iv_nights
|
||||||
|
iv_guests = iv_guests )
|
||||||
|
+ extras( iv_nights = iv_nights
|
||||||
|
iv_guests = iv_guests
|
||||||
|
iv_breakfast = iv_breakfast ).
|
||||||
|
ENDMETHOD.
|
||||||
|
|
||||||
|
METHOD validate.
|
||||||
|
IF iv_nights < 1.
|
||||||
|
rv_reason = {{p}}if_hotel_rate=>c_reason-nights.
|
||||||
|
ELSEIF iv_guests < 1.
|
||||||
|
rv_reason = {{p}}if_hotel_rate=>c_reason-guests.
|
||||||
|
ELSEIF iv_category = {{p}}if_hotel_rate=>c_category-basic
|
||||||
|
AND iv_category <> {{p}}if_hotel_rate=>c_category-comfort
|
||||||
|
AND iv_category <> {{p}}if_hotel_rate=>c_category-suite.
|
||||||
|
rv_reason = {{p}}if_hotel_rate=>c_reason-category.
|
||||||
|
ELSE.
|
||||||
|
rv_reason = {{p}}if_hotel_rate=>c_reason-ok.
|
||||||
|
ENDIF.
|
||||||
|
ENDMETHOD.
|
||||||
|
|
||||||
|
METHOD room_count.
|
||||||
|
rv_rooms = ( iv_guests + 1 ) DIV 2.
|
||||||
|
ENDMETHOD.
|
||||||
|
|
||||||
|
METHOD nightly_rate.
|
||||||
|
CASE iv_category.
|
||||||
|
WHEN {{p}}if_hotel_rate=>c_category-basic.
|
||||||
|
rv_amount = '90.00'.
|
||||||
|
WHEN {{p}}if_hotel_rate=>c_category-comfort.
|
||||||
|
rv_amount = '140.00'.
|
||||||
|
WHEN {{p}}if_hotel_rate=>c_category-suite.
|
||||||
|
rv_amount = '260.00'.
|
||||||
|
ENDCASE.
|
||||||
|
ENDMETHOD.
|
||||||
|
|
||||||
|
METHOD discount_percent.
|
||||||
|
IF iv_nights >= 28.
|
||||||
|
rv_percent = 20.
|
||||||
|
ELSEIF iv_nights >= 14.
|
||||||
|
rv_percent = 15.
|
||||||
|
ELSEIF iv_nights >= 7.
|
||||||
|
rv_percent = 10.
|
||||||
|
ENDIF.
|
||||||
|
ENDMETHOD.
|
||||||
|
|
||||||
|
METHOD net_room_total.
|
||||||
|
DATA lv_total TYPE {{p}}if_hotel_rate=>ty_amount.
|
||||||
|
lv_total = nightly_rate( iv_category ) * room_count( iv_guests ) * iv_nights.
|
||||||
|
DATA lv_discount TYPE {{p}}if_hotel_rate=>ty_amount.
|
||||||
|
lv_discount = lv_total * discount_percent( iv_nights ) / 100.
|
||||||
|
rv_total = lv_total - lv_discount.
|
||||||
|
ENDMETHOD.
|
||||||
|
|
||||||
|
METHOD extras.
|
||||||
|
DATA(lv_guest_nights) = iv_guests * iv_nights.
|
||||||
|
rv_extras = lv_guest_nights * c_city_tax.
|
||||||
|
IF iv_breakfast = abap_true.
|
||||||
|
rv_extras = rv_extras + lv_guest_nights * c_breakfast.
|
||||||
|
ENDIF.
|
||||||
|
ENDMETHOD.
|
||||||
|
ENDCLASS.
|
||||||
108
tasks_gen/eval/G0102/faulty/m1_hotel_rate.clas.abap
Normal file
108
tasks_gen/eval/G0102/faulty/m1_hotel_rate.clas.abap
Normal file
@@ -0,0 +1,108 @@
|
|||||||
|
CLASS {{p}}hotel_rate DEFINITION PUBLIC FINAL CREATE PUBLIC.
|
||||||
|
PUBLIC SECTION.
|
||||||
|
INTERFACES {{p}}if_hotel_rate.
|
||||||
|
|
||||||
|
PRIVATE SECTION.
|
||||||
|
CONSTANTS:
|
||||||
|
c_breakfast TYPE {{p}}if_hotel_rate=>ty_amount VALUE '12.50',
|
||||||
|
c_city_tax TYPE {{p}}if_hotel_rate=>ty_amount VALUE '3.00'.
|
||||||
|
|
||||||
|
METHODS validate
|
||||||
|
IMPORTING iv_category TYPE {{p}}if_hotel_rate=>ty_category
|
||||||
|
iv_nights TYPE i
|
||||||
|
iv_guests TYPE i
|
||||||
|
RETURNING VALUE(rv_reason) TYPE {{p}}if_hotel_rate=>ty_reason.
|
||||||
|
METHODS room_count
|
||||||
|
IMPORTING iv_guests TYPE i
|
||||||
|
RETURNING VALUE(rv_rooms) TYPE i.
|
||||||
|
METHODS nightly_rate
|
||||||
|
IMPORTING iv_category TYPE {{p}}if_hotel_rate=>ty_category
|
||||||
|
RETURNING VALUE(rv_amount) TYPE {{p}}if_hotel_rate=>ty_amount.
|
||||||
|
METHODS discount_percent
|
||||||
|
IMPORTING iv_nights TYPE i
|
||||||
|
RETURNING VALUE(rv_percent) TYPE i.
|
||||||
|
METHODS net_room_total
|
||||||
|
IMPORTING iv_category TYPE {{p}}if_hotel_rate=>ty_category
|
||||||
|
iv_nights TYPE i
|
||||||
|
iv_guests TYPE i
|
||||||
|
RETURNING VALUE(rv_total) TYPE {{p}}if_hotel_rate=>ty_amount.
|
||||||
|
METHODS extras
|
||||||
|
IMPORTING iv_nights TYPE i
|
||||||
|
iv_guests TYPE i
|
||||||
|
iv_breakfast TYPE abap_bool
|
||||||
|
RETURNING VALUE(rv_extras) TYPE {{p}}if_hotel_rate=>ty_amount.
|
||||||
|
ENDCLASS.
|
||||||
|
|
||||||
|
|
||||||
|
CLASS {{p}}hotel_rate IMPLEMENTATION.
|
||||||
|
METHOD {{p}}if_hotel_rate~calculate.
|
||||||
|
rs_result-reason = validate( iv_category = iv_category
|
||||||
|
iv_nights = iv_nights
|
||||||
|
iv_guests = iv_guests ).
|
||||||
|
IF rs_result-reason <> {{p}}if_hotel_rate=>c_reason-ok.
|
||||||
|
rs_result-price = 0.
|
||||||
|
RETURN.
|
||||||
|
ENDIF.
|
||||||
|
rs_result-price = net_room_total( iv_category = iv_category
|
||||||
|
iv_nights = iv_nights
|
||||||
|
iv_guests = iv_guests )
|
||||||
|
+ extras( iv_nights = iv_nights
|
||||||
|
iv_guests = iv_guests
|
||||||
|
iv_breakfast = iv_breakfast ).
|
||||||
|
ENDMETHOD.
|
||||||
|
|
||||||
|
METHOD validate.
|
||||||
|
IF iv_nights < 1.
|
||||||
|
rv_reason = {{p}}if_hotel_rate=>c_reason-nights.
|
||||||
|
ELSEIF iv_guests < 1.
|
||||||
|
rv_reason = {{p}}if_hotel_rate=>c_reason-guests.
|
||||||
|
ELSEIF iv_category <> {{p}}if_hotel_rate=>c_category-basic
|
||||||
|
AND iv_category <> {{p}}if_hotel_rate=>c_category-comfort
|
||||||
|
OR iv_category <> {{p}}if_hotel_rate=>c_category-suite.
|
||||||
|
rv_reason = {{p}}if_hotel_rate=>c_reason-category.
|
||||||
|
ELSE.
|
||||||
|
rv_reason = {{p}}if_hotel_rate=>c_reason-ok.
|
||||||
|
ENDIF.
|
||||||
|
ENDMETHOD.
|
||||||
|
|
||||||
|
METHOD room_count.
|
||||||
|
rv_rooms = ( iv_guests + 1 ) DIV 2.
|
||||||
|
ENDMETHOD.
|
||||||
|
|
||||||
|
METHOD nightly_rate.
|
||||||
|
CASE iv_category.
|
||||||
|
WHEN {{p}}if_hotel_rate=>c_category-basic.
|
||||||
|
rv_amount = '90.00'.
|
||||||
|
WHEN {{p}}if_hotel_rate=>c_category-comfort.
|
||||||
|
rv_amount = '140.00'.
|
||||||
|
WHEN {{p}}if_hotel_rate=>c_category-suite.
|
||||||
|
rv_amount = '260.00'.
|
||||||
|
ENDCASE.
|
||||||
|
ENDMETHOD.
|
||||||
|
|
||||||
|
METHOD discount_percent.
|
||||||
|
IF iv_nights >= 28.
|
||||||
|
rv_percent = 20.
|
||||||
|
ELSEIF iv_nights >= 14.
|
||||||
|
rv_percent = 15.
|
||||||
|
ELSEIF iv_nights >= 7.
|
||||||
|
rv_percent = 10.
|
||||||
|
ENDIF.
|
||||||
|
ENDMETHOD.
|
||||||
|
|
||||||
|
METHOD net_room_total.
|
||||||
|
DATA lv_total TYPE {{p}}if_hotel_rate=>ty_amount.
|
||||||
|
lv_total = nightly_rate( iv_category ) * room_count( iv_guests ) * iv_nights.
|
||||||
|
DATA lv_discount TYPE {{p}}if_hotel_rate=>ty_amount.
|
||||||
|
lv_discount = lv_total * discount_percent( iv_nights ) / 100.
|
||||||
|
rv_total = lv_total - lv_discount.
|
||||||
|
ENDMETHOD.
|
||||||
|
|
||||||
|
METHOD extras.
|
||||||
|
DATA(lv_guest_nights) = iv_guests * iv_nights.
|
||||||
|
rv_extras = lv_guest_nights * c_city_tax.
|
||||||
|
IF iv_breakfast = abap_true.
|
||||||
|
rv_extras = rv_extras + lv_guest_nights * c_breakfast.
|
||||||
|
ENDIF.
|
||||||
|
ENDMETHOD.
|
||||||
|
ENDCLASS.
|
||||||
108
tasks_gen/eval/G0102/faulty/m2_hotel_rate.clas.abap
Normal file
108
tasks_gen/eval/G0102/faulty/m2_hotel_rate.clas.abap
Normal file
@@ -0,0 +1,108 @@
|
|||||||
|
CLASS {{p}}hotel_rate DEFINITION PUBLIC FINAL CREATE PUBLIC.
|
||||||
|
PUBLIC SECTION.
|
||||||
|
INTERFACES {{p}}if_hotel_rate.
|
||||||
|
|
||||||
|
PRIVATE SECTION.
|
||||||
|
CONSTANTS:
|
||||||
|
c_breakfast TYPE {{p}}if_hotel_rate=>ty_amount VALUE '12.50',
|
||||||
|
c_city_tax TYPE {{p}}if_hotel_rate=>ty_amount VALUE '3.00'.
|
||||||
|
|
||||||
|
METHODS validate
|
||||||
|
IMPORTING iv_category TYPE {{p}}if_hotel_rate=>ty_category
|
||||||
|
iv_nights TYPE i
|
||||||
|
iv_guests TYPE i
|
||||||
|
RETURNING VALUE(rv_reason) TYPE {{p}}if_hotel_rate=>ty_reason.
|
||||||
|
METHODS room_count
|
||||||
|
IMPORTING iv_guests TYPE i
|
||||||
|
RETURNING VALUE(rv_rooms) TYPE i.
|
||||||
|
METHODS nightly_rate
|
||||||
|
IMPORTING iv_category TYPE {{p}}if_hotel_rate=>ty_category
|
||||||
|
RETURNING VALUE(rv_amount) TYPE {{p}}if_hotel_rate=>ty_amount.
|
||||||
|
METHODS discount_percent
|
||||||
|
IMPORTING iv_nights TYPE i
|
||||||
|
RETURNING VALUE(rv_percent) TYPE i.
|
||||||
|
METHODS net_room_total
|
||||||
|
IMPORTING iv_category TYPE {{p}}if_hotel_rate=>ty_category
|
||||||
|
iv_nights TYPE i
|
||||||
|
iv_guests TYPE i
|
||||||
|
RETURNING VALUE(rv_total) TYPE {{p}}if_hotel_rate=>ty_amount.
|
||||||
|
METHODS extras
|
||||||
|
IMPORTING iv_nights TYPE i
|
||||||
|
iv_guests TYPE i
|
||||||
|
iv_breakfast TYPE abap_bool
|
||||||
|
RETURNING VALUE(rv_extras) TYPE {{p}}if_hotel_rate=>ty_amount.
|
||||||
|
ENDCLASS.
|
||||||
|
|
||||||
|
|
||||||
|
CLASS {{p}}hotel_rate IMPLEMENTATION.
|
||||||
|
METHOD {{p}}if_hotel_rate~calculate.
|
||||||
|
rs_result-reason = validate( iv_category = iv_category
|
||||||
|
iv_nights = iv_nights
|
||||||
|
iv_guests = iv_guests ).
|
||||||
|
IF rs_result-reason <> {{p}}if_hotel_rate=>c_reason-ok.
|
||||||
|
rs_result-price = 0.
|
||||||
|
RETURN.
|
||||||
|
ENDIF.
|
||||||
|
rs_result-price = net_room_total( iv_category = iv_category
|
||||||
|
iv_nights = iv_nights
|
||||||
|
iv_guests = iv_guests )
|
||||||
|
+ extras( iv_nights = iv_nights
|
||||||
|
iv_guests = iv_guests
|
||||||
|
iv_breakfast = iv_breakfast ).
|
||||||
|
ENDMETHOD.
|
||||||
|
|
||||||
|
METHOD validate.
|
||||||
|
IF iv_nights < 1.
|
||||||
|
rv_reason = {{p}}if_hotel_rate=>c_reason-nights.
|
||||||
|
ELSEIF iv_guests < 1.
|
||||||
|
rv_reason = {{p}}if_hotel_rate=>c_reason-guests.
|
||||||
|
ELSEIF iv_category <> {{p}}if_hotel_rate=>c_category-basic
|
||||||
|
AND iv_category <> {{p}}if_hotel_rate=>c_category-comfort
|
||||||
|
AND iv_category <> {{p}}if_hotel_rate=>c_category-suite.
|
||||||
|
rv_reason = {{p}}if_hotel_rate=>c_reason-category.
|
||||||
|
ELSE.
|
||||||
|
rv_reason = {{p}}if_hotel_rate=>c_reason-ok.
|
||||||
|
ENDIF.
|
||||||
|
ENDMETHOD.
|
||||||
|
|
||||||
|
METHOD room_count.
|
||||||
|
rv_rooms = ( iv_guests + 2 ) DIV 2.
|
||||||
|
ENDMETHOD.
|
||||||
|
|
||||||
|
METHOD nightly_rate.
|
||||||
|
CASE iv_category.
|
||||||
|
WHEN {{p}}if_hotel_rate=>c_category-basic.
|
||||||
|
rv_amount = '90.00'.
|
||||||
|
WHEN {{p}}if_hotel_rate=>c_category-comfort.
|
||||||
|
rv_amount = '140.00'.
|
||||||
|
WHEN {{p}}if_hotel_rate=>c_category-suite.
|
||||||
|
rv_amount = '260.00'.
|
||||||
|
ENDCASE.
|
||||||
|
ENDMETHOD.
|
||||||
|
|
||||||
|
METHOD discount_percent.
|
||||||
|
IF iv_nights >= 28.
|
||||||
|
rv_percent = 20.
|
||||||
|
ELSEIF iv_nights >= 14.
|
||||||
|
rv_percent = 15.
|
||||||
|
ELSEIF iv_nights >= 7.
|
||||||
|
rv_percent = 10.
|
||||||
|
ENDIF.
|
||||||
|
ENDMETHOD.
|
||||||
|
|
||||||
|
METHOD net_room_total.
|
||||||
|
DATA lv_total TYPE {{p}}if_hotel_rate=>ty_amount.
|
||||||
|
lv_total = nightly_rate( iv_category ) * room_count( iv_guests ) * iv_nights.
|
||||||
|
DATA lv_discount TYPE {{p}}if_hotel_rate=>ty_amount.
|
||||||
|
lv_discount = lv_total * discount_percent( iv_nights ) / 100.
|
||||||
|
rv_total = lv_total - lv_discount.
|
||||||
|
ENDMETHOD.
|
||||||
|
|
||||||
|
METHOD extras.
|
||||||
|
DATA(lv_guest_nights) = iv_guests * iv_nights.
|
||||||
|
rv_extras = lv_guest_nights * c_city_tax.
|
||||||
|
IF iv_breakfast = abap_true.
|
||||||
|
rv_extras = rv_extras + lv_guest_nights * c_breakfast.
|
||||||
|
ENDIF.
|
||||||
|
ENDMETHOD.
|
||||||
|
ENDCLASS.
|
||||||
108
tasks_gen/eval/G0102/faulty/m3_hotel_rate.clas.abap
Normal file
108
tasks_gen/eval/G0102/faulty/m3_hotel_rate.clas.abap
Normal file
@@ -0,0 +1,108 @@
|
|||||||
|
CLASS {{p}}hotel_rate DEFINITION PUBLIC FINAL CREATE PUBLIC.
|
||||||
|
PUBLIC SECTION.
|
||||||
|
INTERFACES {{p}}if_hotel_rate.
|
||||||
|
|
||||||
|
PRIVATE SECTION.
|
||||||
|
CONSTANTS:
|
||||||
|
c_breakfast TYPE {{p}}if_hotel_rate=>ty_amount VALUE '12.50',
|
||||||
|
c_city_tax TYPE {{p}}if_hotel_rate=>ty_amount VALUE '3.00'.
|
||||||
|
|
||||||
|
METHODS validate
|
||||||
|
IMPORTING iv_category TYPE {{p}}if_hotel_rate=>ty_category
|
||||||
|
iv_nights TYPE i
|
||||||
|
iv_guests TYPE i
|
||||||
|
RETURNING VALUE(rv_reason) TYPE {{p}}if_hotel_rate=>ty_reason.
|
||||||
|
METHODS room_count
|
||||||
|
IMPORTING iv_guests TYPE i
|
||||||
|
RETURNING VALUE(rv_rooms) TYPE i.
|
||||||
|
METHODS nightly_rate
|
||||||
|
IMPORTING iv_category TYPE {{p}}if_hotel_rate=>ty_category
|
||||||
|
RETURNING VALUE(rv_amount) TYPE {{p}}if_hotel_rate=>ty_amount.
|
||||||
|
METHODS discount_percent
|
||||||
|
IMPORTING iv_nights TYPE i
|
||||||
|
RETURNING VALUE(rv_percent) TYPE i.
|
||||||
|
METHODS net_room_total
|
||||||
|
IMPORTING iv_category TYPE {{p}}if_hotel_rate=>ty_category
|
||||||
|
iv_nights TYPE i
|
||||||
|
iv_guests TYPE i
|
||||||
|
RETURNING VALUE(rv_total) TYPE {{p}}if_hotel_rate=>ty_amount.
|
||||||
|
METHODS extras
|
||||||
|
IMPORTING iv_nights TYPE i
|
||||||
|
iv_guests TYPE i
|
||||||
|
iv_breakfast TYPE abap_bool
|
||||||
|
RETURNING VALUE(rv_extras) TYPE {{p}}if_hotel_rate=>ty_amount.
|
||||||
|
ENDCLASS.
|
||||||
|
|
||||||
|
|
||||||
|
CLASS {{p}}hotel_rate IMPLEMENTATION.
|
||||||
|
METHOD {{p}}if_hotel_rate~calculate.
|
||||||
|
rs_result-reason = validate( iv_category = iv_category
|
||||||
|
iv_nights = iv_nights
|
||||||
|
iv_guests = iv_guests ).
|
||||||
|
IF rs_result-reason <> {{p}}if_hotel_rate=>c_reason-ok.
|
||||||
|
rs_result-price = 0.
|
||||||
|
RETURN.
|
||||||
|
ENDIF.
|
||||||
|
rs_result-price = net_room_total( iv_category = iv_category
|
||||||
|
iv_nights = iv_nights
|
||||||
|
iv_guests = iv_guests )
|
||||||
|
+ extras( iv_nights = iv_nights
|
||||||
|
iv_guests = iv_guests
|
||||||
|
iv_breakfast = iv_breakfast ).
|
||||||
|
ENDMETHOD.
|
||||||
|
|
||||||
|
METHOD validate.
|
||||||
|
IF iv_nights < 1.
|
||||||
|
rv_reason = {{p}}if_hotel_rate=>c_reason-nights.
|
||||||
|
ELSEIF iv_guests < 1.
|
||||||
|
rv_reason = {{p}}if_hotel_rate=>c_reason-guests.
|
||||||
|
ELSEIF iv_category <> {{p}}if_hotel_rate=>c_category-basic
|
||||||
|
AND iv_category <> {{p}}if_hotel_rate=>c_category-comfort
|
||||||
|
AND iv_category <> {{p}}if_hotel_rate=>c_category-suite.
|
||||||
|
rv_reason = {{p}}if_hotel_rate=>c_reason-category.
|
||||||
|
ELSE.
|
||||||
|
rv_reason = {{p}}if_hotel_rate=>c_reason-ok.
|
||||||
|
ENDIF.
|
||||||
|
ENDMETHOD.
|
||||||
|
|
||||||
|
METHOD room_count.
|
||||||
|
rv_rooms = ( iv_guests + 1 ) DIV 2.
|
||||||
|
ENDMETHOD.
|
||||||
|
|
||||||
|
METHOD nightly_rate.
|
||||||
|
CASE iv_category.
|
||||||
|
WHEN {{p}}if_hotel_rate=>c_category-basic.
|
||||||
|
rv_amount = '90.00'.
|
||||||
|
WHEN {{p}}if_hotel_rate=>c_category-comfort.
|
||||||
|
rv_amount = '140.00'.
|
||||||
|
WHEN {{p}}if_hotel_rate=>c_category-suite.
|
||||||
|
rv_amount = '260.00'.
|
||||||
|
ENDCASE.
|
||||||
|
ENDMETHOD.
|
||||||
|
|
||||||
|
METHOD discount_percent.
|
||||||
|
IF iv_nights >= 28.
|
||||||
|
rv_percent = 20.
|
||||||
|
ELSEIF iv_nights >= 14.
|
||||||
|
rv_percent = 15.
|
||||||
|
ELSEIF iv_nights >= 7.
|
||||||
|
rv_percent = 10.
|
||||||
|
ENDIF.
|
||||||
|
ENDMETHOD.
|
||||||
|
|
||||||
|
METHOD net_room_total.
|
||||||
|
DATA lv_total TYPE {{p}}if_hotel_rate=>ty_amount.
|
||||||
|
lv_total = nightly_rate( iv_category ) * room_count( iv_guests ) * iv_nights.
|
||||||
|
DATA lv_discount TYPE {{p}}if_hotel_rate=>ty_amount.
|
||||||
|
lv_discount = lv_total * discount_percent( iv_nights ) / 100.
|
||||||
|
rv_total = lv_total + lv_discount.
|
||||||
|
ENDMETHOD.
|
||||||
|
|
||||||
|
METHOD extras.
|
||||||
|
DATA(lv_guest_nights) = iv_guests * iv_nights.
|
||||||
|
rv_extras = lv_guest_nights * c_city_tax.
|
||||||
|
IF iv_breakfast = abap_true.
|
||||||
|
rv_extras = rv_extras + lv_guest_nights * c_breakfast.
|
||||||
|
ENDIF.
|
||||||
|
ENDMETHOD.
|
||||||
|
ENDCLASS.
|
||||||
108
tasks_gen/eval/G0102/faulty/m4_hotel_rate.clas.abap
Normal file
108
tasks_gen/eval/G0102/faulty/m4_hotel_rate.clas.abap
Normal file
@@ -0,0 +1,108 @@
|
|||||||
|
CLASS {{p}}hotel_rate DEFINITION PUBLIC FINAL CREATE PUBLIC.
|
||||||
|
PUBLIC SECTION.
|
||||||
|
INTERFACES {{p}}if_hotel_rate.
|
||||||
|
|
||||||
|
PRIVATE SECTION.
|
||||||
|
CONSTANTS:
|
||||||
|
c_breakfast TYPE {{p}}if_hotel_rate=>ty_amount VALUE '12.50',
|
||||||
|
c_city_tax TYPE {{p}}if_hotel_rate=>ty_amount VALUE '3.00'.
|
||||||
|
|
||||||
|
METHODS validate
|
||||||
|
IMPORTING iv_category TYPE {{p}}if_hotel_rate=>ty_category
|
||||||
|
iv_nights TYPE i
|
||||||
|
iv_guests TYPE i
|
||||||
|
RETURNING VALUE(rv_reason) TYPE {{p}}if_hotel_rate=>ty_reason.
|
||||||
|
METHODS room_count
|
||||||
|
IMPORTING iv_guests TYPE i
|
||||||
|
RETURNING VALUE(rv_rooms) TYPE i.
|
||||||
|
METHODS nightly_rate
|
||||||
|
IMPORTING iv_category TYPE {{p}}if_hotel_rate=>ty_category
|
||||||
|
RETURNING VALUE(rv_amount) TYPE {{p}}if_hotel_rate=>ty_amount.
|
||||||
|
METHODS discount_percent
|
||||||
|
IMPORTING iv_nights TYPE i
|
||||||
|
RETURNING VALUE(rv_percent) TYPE i.
|
||||||
|
METHODS net_room_total
|
||||||
|
IMPORTING iv_category TYPE {{p}}if_hotel_rate=>ty_category
|
||||||
|
iv_nights TYPE i
|
||||||
|
iv_guests TYPE i
|
||||||
|
RETURNING VALUE(rv_total) TYPE {{p}}if_hotel_rate=>ty_amount.
|
||||||
|
METHODS extras
|
||||||
|
IMPORTING iv_nights TYPE i
|
||||||
|
iv_guests TYPE i
|
||||||
|
iv_breakfast TYPE abap_bool
|
||||||
|
RETURNING VALUE(rv_extras) TYPE {{p}}if_hotel_rate=>ty_amount.
|
||||||
|
ENDCLASS.
|
||||||
|
|
||||||
|
|
||||||
|
CLASS {{p}}hotel_rate IMPLEMENTATION.
|
||||||
|
METHOD {{p}}if_hotel_rate~calculate.
|
||||||
|
rs_result-reason = validate( iv_category = iv_category
|
||||||
|
iv_nights = iv_nights
|
||||||
|
iv_guests = iv_guests ).
|
||||||
|
IF rs_result-reason <> {{p}}if_hotel_rate=>c_reason-ok.
|
||||||
|
rs_result-price = 0.
|
||||||
|
RETURN.
|
||||||
|
ENDIF.
|
||||||
|
rs_result-price = net_room_total( iv_category = iv_category
|
||||||
|
iv_nights = iv_nights
|
||||||
|
iv_guests = iv_guests )
|
||||||
|
+ extras( iv_nights = iv_nights
|
||||||
|
iv_guests = iv_guests
|
||||||
|
iv_breakfast = iv_breakfast ).
|
||||||
|
ENDMETHOD.
|
||||||
|
|
||||||
|
METHOD validate.
|
||||||
|
IF iv_nights < 1.
|
||||||
|
rv_reason = {{p}}if_hotel_rate=>c_reason-nights.
|
||||||
|
ELSEIF iv_guests < 1.
|
||||||
|
rv_reason = {{p}}if_hotel_rate=>c_reason-guests.
|
||||||
|
ELSEIF iv_category <> {{p}}if_hotel_rate=>c_category-basic
|
||||||
|
AND iv_category <> {{p}}if_hotel_rate=>c_category-comfort
|
||||||
|
AND iv_category <> {{p}}if_hotel_rate=>c_category-suite.
|
||||||
|
rv_reason = {{p}}if_hotel_rate=>c_reason-category.
|
||||||
|
ELSE.
|
||||||
|
rv_reason = {{p}}if_hotel_rate=>c_reason-ok.
|
||||||
|
ENDIF.
|
||||||
|
ENDMETHOD.
|
||||||
|
|
||||||
|
METHOD room_count.
|
||||||
|
rv_rooms = ( iv_guests + 1 ) DIV 2.
|
||||||
|
ENDMETHOD.
|
||||||
|
|
||||||
|
METHOD nightly_rate.
|
||||||
|
CASE iv_category.
|
||||||
|
WHEN {{p}}if_hotel_rate=>c_category-basic.
|
||||||
|
rv_amount = '90.00'.
|
||||||
|
WHEN {{p}}if_hotel_rate=>c_category-comfort.
|
||||||
|
rv_amount = '140.00'.
|
||||||
|
WHEN {{p}}if_hotel_rate=>c_category-suite.
|
||||||
|
rv_amount = '260.00'.
|
||||||
|
ENDCASE.
|
||||||
|
ENDMETHOD.
|
||||||
|
|
||||||
|
METHOD discount_percent.
|
||||||
|
IF iv_nights >= 28.
|
||||||
|
rv_percent = 20.
|
||||||
|
ELSEIF iv_nights >= 14.
|
||||||
|
rv_percent = 15.
|
||||||
|
ELSEIF iv_nights >= 7.
|
||||||
|
rv_percent = 10.
|
||||||
|
ENDIF.
|
||||||
|
ENDMETHOD.
|
||||||
|
|
||||||
|
METHOD net_room_total.
|
||||||
|
DATA lv_total TYPE {{p}}if_hotel_rate=>ty_amount.
|
||||||
|
lv_total = nightly_rate( iv_category ) * room_count( iv_guests ) * iv_nights.
|
||||||
|
DATA lv_discount TYPE {{p}}if_hotel_rate=>ty_amount.
|
||||||
|
lv_discount = lv_total * discount_percent( iv_nights ) / 100.
|
||||||
|
rv_total = lv_total - lv_discount.
|
||||||
|
ENDMETHOD.
|
||||||
|
|
||||||
|
METHOD extras.
|
||||||
|
DATA(lv_guest_nights) = iv_guests * iv_nights.
|
||||||
|
rv_extras = lv_guest_nights * c_city_tax.
|
||||||
|
IF iv_breakfast = abap_false.
|
||||||
|
rv_extras = rv_extras + lv_guest_nights * c_breakfast.
|
||||||
|
ENDIF.
|
||||||
|
ENDMETHOD.
|
||||||
|
ENDCLASS.
|
||||||
19
tasks_gen/eval/G0102/generation.json
Normal file
19
tasks_gen/eval/G0102/generation.json
Normal file
@@ -0,0 +1,19 @@
|
|||||||
|
{
|
||||||
|
"id": "G0102",
|
||||||
|
"pool": "eval",
|
||||||
|
"object_type": "CLAS",
|
||||||
|
"category": "A",
|
||||||
|
"attempts": [
|
||||||
|
{
|
||||||
|
"stage": "validate",
|
||||||
|
"oracle": 100.0,
|
||||||
|
"null": 0,
|
||||||
|
"mutation": {
|
||||||
|
"valid": 5,
|
||||||
|
"killed": 5,
|
||||||
|
"ok": true
|
||||||
|
}
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"accepted": true
|
||||||
|
}
|
||||||
145
tasks_gen/eval/G0102/hidden/t13_hidden.clas.abap
Normal file
145
tasks_gen/eval/G0102/hidden/t13_hidden.clas.abap
Normal file
@@ -0,0 +1,145 @@
|
|||||||
|
CLASS {{p}}t13_hidden DEFINITION PUBLIC FINAL CREATE PUBLIC
|
||||||
|
FOR TESTING DURATION SHORT RISK LEVEL HARMLESS.
|
||||||
|
PRIVATE SECTION.
|
||||||
|
DATA mo_cut TYPE REF TO {{p}}if_hotel_rate.
|
||||||
|
METHODS setup.
|
||||||
|
METHODS expect_price
|
||||||
|
IMPORTING iv_expected TYPE {{p}}if_hotel_rate=>ty_amount
|
||||||
|
iv_actual TYPE {{p}}if_hotel_rate=>ty_amount.
|
||||||
|
METHODS rejects_zero_nights FOR TESTING.
|
||||||
|
METHODS rejects_zero_guests FOR TESTING.
|
||||||
|
METHODS rejects_unknown_category FOR TESTING.
|
||||||
|
METHODS validation_order FOR TESTING.
|
||||||
|
METHODS single_standard_night FOR TESTING.
|
||||||
|
METHODS two_guests_one_room FOR TESTING.
|
||||||
|
METHODS three_guests_two_rooms FOR TESTING.
|
||||||
|
METHODS breakfast_per_guest FOR TESTING.
|
||||||
|
METHODS discount_starts_at_seven FOR TESTING.
|
||||||
|
METHODS discount_fifteen_percent FOR TESTING.
|
||||||
|
METHODS discount_twenty_percent FOR TESTING.
|
||||||
|
ENDCLASS.
|
||||||
|
|
||||||
|
|
||||||
|
CLASS {{p}}t13_hidden IMPLEMENTATION.
|
||||||
|
METHOD setup.
|
||||||
|
mo_cut = NEW {{p}}hotel_rate( ).
|
||||||
|
ENDMETHOD.
|
||||||
|
|
||||||
|
METHOD expect_price.
|
||||||
|
cl_abap_unit_assert=>assert_equals( exp = iv_expected act = iv_actual ).
|
||||||
|
ENDMETHOD.
|
||||||
|
|
||||||
|
METHOD rejects_zero_nights.
|
||||||
|
DATA(ls_result) = mo_cut->calculate( iv_category = {{p}}if_hotel_rate=>c_category-basic
|
||||||
|
iv_nights = 0
|
||||||
|
iv_guests = 2
|
||||||
|
iv_breakfast = abap_false ).
|
||||||
|
cl_abap_unit_assert=>assert_equals( exp = {{p}}if_hotel_rate=>c_reason-nights
|
||||||
|
act = ls_result-reason ).
|
||||||
|
expect_price( iv_expected = '0.00' iv_actual = ls_result-price ).
|
||||||
|
ENDMETHOD.
|
||||||
|
|
||||||
|
METHOD rejects_zero_guests.
|
||||||
|
DATA(ls_result) = mo_cut->calculate( iv_category = {{p}}if_hotel_rate=>c_category-basic
|
||||||
|
iv_nights = 3
|
||||||
|
iv_guests = 0
|
||||||
|
iv_breakfast = abap_true ).
|
||||||
|
cl_abap_unit_assert=>assert_equals( exp = {{p}}if_hotel_rate=>c_reason-guests
|
||||||
|
act = ls_result-reason ).
|
||||||
|
expect_price( iv_expected = '0.00' iv_actual = ls_result-price ).
|
||||||
|
ENDMETHOD.
|
||||||
|
|
||||||
|
METHOD rejects_unknown_category.
|
||||||
|
DATA(ls_result) = mo_cut->calculate( iv_category = 'X'
|
||||||
|
iv_nights = 2
|
||||||
|
iv_guests = 1
|
||||||
|
iv_breakfast = abap_false ).
|
||||||
|
cl_abap_unit_assert=>assert_equals( exp = {{p}}if_hotel_rate=>c_reason-category
|
||||||
|
act = ls_result-reason ).
|
||||||
|
expect_price( iv_expected = '0.00' iv_actual = ls_result-price ).
|
||||||
|
ENDMETHOD.
|
||||||
|
|
||||||
|
METHOD validation_order.
|
||||||
|
DATA(ls_result) = mo_cut->calculate( iv_category = 'X'
|
||||||
|
iv_nights = 0
|
||||||
|
iv_guests = 0
|
||||||
|
iv_breakfast = abap_false ).
|
||||||
|
cl_abap_unit_assert=>assert_equals( exp = {{p}}if_hotel_rate=>c_reason-nights
|
||||||
|
act = ls_result-reason ).
|
||||||
|
ls_result = mo_cut->calculate( iv_category = 'X'
|
||||||
|
iv_nights = 2
|
||||||
|
iv_guests = 0
|
||||||
|
iv_breakfast = abap_false ).
|
||||||
|
cl_abap_unit_assert=>assert_equals( exp = {{p}}if_hotel_rate=>c_reason-guests
|
||||||
|
act = ls_result-reason ).
|
||||||
|
ls_result = mo_cut->calculate( iv_category = 'X'
|
||||||
|
iv_nights = 2
|
||||||
|
iv_guests = 2
|
||||||
|
iv_breakfast = abap_false ).
|
||||||
|
cl_abap_unit_assert=>assert_equals( exp = {{p}}if_hotel_rate=>c_reason-category
|
||||||
|
act = ls_result-reason ).
|
||||||
|
ENDMETHOD.
|
||||||
|
|
||||||
|
METHOD single_standard_night.
|
||||||
|
DATA(ls_result) = mo_cut->calculate( iv_category = {{p}}if_hotel_rate=>c_category-basic
|
||||||
|
iv_nights = 1
|
||||||
|
iv_guests = 1
|
||||||
|
iv_breakfast = abap_false ).
|
||||||
|
cl_abap_unit_assert=>assert_equals( exp = {{p}}if_hotel_rate=>c_reason-ok
|
||||||
|
act = ls_result-reason ).
|
||||||
|
expect_price( iv_expected = '93.00' iv_actual = ls_result-price ).
|
||||||
|
ENDMETHOD.
|
||||||
|
|
||||||
|
METHOD two_guests_one_room.
|
||||||
|
DATA(ls_result) = mo_cut->calculate( iv_category = {{p}}if_hotel_rate=>c_category-comfort
|
||||||
|
iv_nights = 3
|
||||||
|
iv_guests = 2
|
||||||
|
iv_breakfast = abap_false ).
|
||||||
|
expect_price( iv_expected = '438.00' iv_actual = ls_result-price ).
|
||||||
|
ENDMETHOD.
|
||||||
|
|
||||||
|
METHOD three_guests_two_rooms.
|
||||||
|
DATA(ls_result) = mo_cut->calculate( iv_category = {{p}}if_hotel_rate=>c_category-comfort
|
||||||
|
iv_nights = 2
|
||||||
|
iv_guests = 3
|
||||||
|
iv_breakfast = abap_false ).
|
||||||
|
expect_price( iv_expected = '578.00' iv_actual = ls_result-price ).
|
||||||
|
ENDMETHOD.
|
||||||
|
|
||||||
|
METHOD breakfast_per_guest.
|
||||||
|
DATA(ls_result) = mo_cut->calculate( iv_category = {{p}}if_hotel_rate=>c_category-basic
|
||||||
|
iv_nights = 2
|
||||||
|
iv_guests = 2
|
||||||
|
iv_breakfast = abap_true ).
|
||||||
|
expect_price( iv_expected = '242.00' iv_actual = ls_result-price ).
|
||||||
|
ENDMETHOD.
|
||||||
|
|
||||||
|
METHOD discount_starts_at_seven.
|
||||||
|
DATA(ls_result) = mo_cut->calculate( iv_category = {{p}}if_hotel_rate=>c_category-basic
|
||||||
|
iv_nights = 6
|
||||||
|
iv_guests = 1
|
||||||
|
iv_breakfast = abap_false ).
|
||||||
|
expect_price( iv_expected = '558.00' iv_actual = ls_result-price ).
|
||||||
|
ls_result = mo_cut->calculate( iv_category = {{p}}if_hotel_rate=>c_category-basic
|
||||||
|
iv_nights = 7
|
||||||
|
iv_guests = 1
|
||||||
|
iv_breakfast = abap_false ).
|
||||||
|
expect_price( iv_expected = '588.00' iv_actual = ls_result-price ).
|
||||||
|
ENDMETHOD.
|
||||||
|
|
||||||
|
METHOD discount_fifteen_percent.
|
||||||
|
DATA(ls_result) = mo_cut->calculate( iv_category = {{p}}if_hotel_rate=>c_category-comfort
|
||||||
|
iv_nights = 14
|
||||||
|
iv_guests = 2
|
||||||
|
iv_breakfast = abap_false ).
|
||||||
|
expect_price( iv_expected = '1750.00' iv_actual = ls_result-price ).
|
||||||
|
ENDMETHOD.
|
||||||
|
|
||||||
|
METHOD discount_twenty_percent.
|
||||||
|
DATA(ls_result) = mo_cut->calculate( iv_category = {{p}}if_hotel_rate=>c_category-suite
|
||||||
|
iv_nights = 28
|
||||||
|
iv_guests = 1
|
||||||
|
iv_breakfast = abap_false ).
|
||||||
|
expect_price( iv_expected = '5908.00' iv_actual = ls_result-price ).
|
||||||
|
ENDMETHOD.
|
||||||
|
ENDCLASS.
|
||||||
74
tasks_gen/eval/G0102/mutation.json
Normal file
74
tasks_gen/eval/G0102/mutation.json
Normal file
@@ -0,0 +1,74 @@
|
|||||||
|
{
|
||||||
|
"task": "G0102",
|
||||||
|
"mutants": [
|
||||||
|
{
|
||||||
|
"object": "{{P}}HOTEL_RATE",
|
||||||
|
"mutant": "line 59: <> -> = (rel)",
|
||||||
|
"status": "killed",
|
||||||
|
"hidden": "6/11",
|
||||||
|
"failed_tests": [
|
||||||
|
"BREAKFAST_PER_GUEST",
|
||||||
|
"DISCOUNT_STARTS_AT_SEVEN",
|
||||||
|
"REJECTS_UNKNOWN_CATEGORY",
|
||||||
|
"SINGLE_STANDARD_NIGHT",
|
||||||
|
"VALIDATION_ORDER"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"object": "{{P}}HOTEL_RATE",
|
||||||
|
"mutant": "line 61: AND -> OR (logic)",
|
||||||
|
"status": "killed",
|
||||||
|
"hidden": "4/11",
|
||||||
|
"failed_tests": [
|
||||||
|
"BREAKFAST_PER_GUEST",
|
||||||
|
"DISCOUNT_FIFTEEN_PERCENT",
|
||||||
|
"DISCOUNT_STARTS_AT_SEVEN",
|
||||||
|
"DISCOUNT_TWENTY_PERCENT",
|
||||||
|
"SINGLE_STANDARD_NIGHT",
|
||||||
|
"THREE_GUESTS_TWO_ROOMS",
|
||||||
|
"TWO_GUESTS_ONE_ROOM"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"object": "{{P}}HOTEL_RATE",
|
||||||
|
"mutant": "line 69: 1 -> 2 (const)",
|
||||||
|
"status": "killed",
|
||||||
|
"hidden": "8/11",
|
||||||
|
"failed_tests": [
|
||||||
|
"BREAKFAST_PER_GUEST",
|
||||||
|
"DISCOUNT_FIFTEEN_PERCENT",
|
||||||
|
"TWO_GUESTS_ONE_ROOM"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"object": "{{P}}HOTEL_RATE",
|
||||||
|
"mutant": "line 98: - -> + (arith)",
|
||||||
|
"status": "killed",
|
||||||
|
"hidden": "8/11",
|
||||||
|
"failed_tests": [
|
||||||
|
"DISCOUNT_FIFTEEN_PERCENT",
|
||||||
|
"DISCOUNT_STARTS_AT_SEVEN",
|
||||||
|
"DISCOUNT_TWENTY_PERCENT"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"object": "{{P}}HOTEL_RATE",
|
||||||
|
"mutant": "line 104: abap_true -> abap_false (bool)",
|
||||||
|
"status": "killed",
|
||||||
|
"hidden": "4/11",
|
||||||
|
"failed_tests": [
|
||||||
|
"BREAKFAST_PER_GUEST",
|
||||||
|
"DISCOUNT_FIFTEEN_PERCENT",
|
||||||
|
"DISCOUNT_STARTS_AT_SEVEN",
|
||||||
|
"DISCOUNT_TWENTY_PERCENT",
|
||||||
|
"SINGLE_STANDARD_NIGHT",
|
||||||
|
"THREE_GUESTS_TWO_ROOMS",
|
||||||
|
"TWO_GUESTS_ONE_ROOM"
|
||||||
|
]
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"valid": 5,
|
||||||
|
"killed": 5,
|
||||||
|
"kill_rate": 1.0,
|
||||||
|
"ok": true
|
||||||
|
}
|
||||||
108
tasks_gen/eval/G0102/reference/hotel_rate.clas.abap
Normal file
108
tasks_gen/eval/G0102/reference/hotel_rate.clas.abap
Normal file
@@ -0,0 +1,108 @@
|
|||||||
|
CLASS {{p}}hotel_rate DEFINITION PUBLIC FINAL CREATE PUBLIC.
|
||||||
|
PUBLIC SECTION.
|
||||||
|
INTERFACES {{p}}if_hotel_rate.
|
||||||
|
|
||||||
|
PRIVATE SECTION.
|
||||||
|
CONSTANTS:
|
||||||
|
c_breakfast TYPE {{p}}if_hotel_rate=>ty_amount VALUE '12.50',
|
||||||
|
c_city_tax TYPE {{p}}if_hotel_rate=>ty_amount VALUE '3.00'.
|
||||||
|
|
||||||
|
METHODS validate
|
||||||
|
IMPORTING iv_category TYPE {{p}}if_hotel_rate=>ty_category
|
||||||
|
iv_nights TYPE i
|
||||||
|
iv_guests TYPE i
|
||||||
|
RETURNING VALUE(rv_reason) TYPE {{p}}if_hotel_rate=>ty_reason.
|
||||||
|
METHODS room_count
|
||||||
|
IMPORTING iv_guests TYPE i
|
||||||
|
RETURNING VALUE(rv_rooms) TYPE i.
|
||||||
|
METHODS nightly_rate
|
||||||
|
IMPORTING iv_category TYPE {{p}}if_hotel_rate=>ty_category
|
||||||
|
RETURNING VALUE(rv_amount) TYPE {{p}}if_hotel_rate=>ty_amount.
|
||||||
|
METHODS discount_percent
|
||||||
|
IMPORTING iv_nights TYPE i
|
||||||
|
RETURNING VALUE(rv_percent) TYPE i.
|
||||||
|
METHODS net_room_total
|
||||||
|
IMPORTING iv_category TYPE {{p}}if_hotel_rate=>ty_category
|
||||||
|
iv_nights TYPE i
|
||||||
|
iv_guests TYPE i
|
||||||
|
RETURNING VALUE(rv_total) TYPE {{p}}if_hotel_rate=>ty_amount.
|
||||||
|
METHODS extras
|
||||||
|
IMPORTING iv_nights TYPE i
|
||||||
|
iv_guests TYPE i
|
||||||
|
iv_breakfast TYPE abap_bool
|
||||||
|
RETURNING VALUE(rv_extras) TYPE {{p}}if_hotel_rate=>ty_amount.
|
||||||
|
ENDCLASS.
|
||||||
|
|
||||||
|
|
||||||
|
CLASS {{p}}hotel_rate IMPLEMENTATION.
|
||||||
|
METHOD {{p}}if_hotel_rate~calculate.
|
||||||
|
rs_result-reason = validate( iv_category = iv_category
|
||||||
|
iv_nights = iv_nights
|
||||||
|
iv_guests = iv_guests ).
|
||||||
|
IF rs_result-reason <> {{p}}if_hotel_rate=>c_reason-ok.
|
||||||
|
rs_result-price = 0.
|
||||||
|
RETURN.
|
||||||
|
ENDIF.
|
||||||
|
rs_result-price = net_room_total( iv_category = iv_category
|
||||||
|
iv_nights = iv_nights
|
||||||
|
iv_guests = iv_guests )
|
||||||
|
+ extras( iv_nights = iv_nights
|
||||||
|
iv_guests = iv_guests
|
||||||
|
iv_breakfast = iv_breakfast ).
|
||||||
|
ENDMETHOD.
|
||||||
|
|
||||||
|
METHOD validate.
|
||||||
|
IF iv_nights < 1.
|
||||||
|
rv_reason = {{p}}if_hotel_rate=>c_reason-nights.
|
||||||
|
ELSEIF iv_guests < 1.
|
||||||
|
rv_reason = {{p}}if_hotel_rate=>c_reason-guests.
|
||||||
|
ELSEIF iv_category <> {{p}}if_hotel_rate=>c_category-basic
|
||||||
|
AND iv_category <> {{p}}if_hotel_rate=>c_category-comfort
|
||||||
|
AND iv_category <> {{p}}if_hotel_rate=>c_category-suite.
|
||||||
|
rv_reason = {{p}}if_hotel_rate=>c_reason-category.
|
||||||
|
ELSE.
|
||||||
|
rv_reason = {{p}}if_hotel_rate=>c_reason-ok.
|
||||||
|
ENDIF.
|
||||||
|
ENDMETHOD.
|
||||||
|
|
||||||
|
METHOD room_count.
|
||||||
|
rv_rooms = ( iv_guests + 1 ) DIV 2.
|
||||||
|
ENDMETHOD.
|
||||||
|
|
||||||
|
METHOD nightly_rate.
|
||||||
|
CASE iv_category.
|
||||||
|
WHEN {{p}}if_hotel_rate=>c_category-basic.
|
||||||
|
rv_amount = '90.00'.
|
||||||
|
WHEN {{p}}if_hotel_rate=>c_category-comfort.
|
||||||
|
rv_amount = '140.00'.
|
||||||
|
WHEN {{p}}if_hotel_rate=>c_category-suite.
|
||||||
|
rv_amount = '260.00'.
|
||||||
|
ENDCASE.
|
||||||
|
ENDMETHOD.
|
||||||
|
|
||||||
|
METHOD discount_percent.
|
||||||
|
IF iv_nights >= 28.
|
||||||
|
rv_percent = 20.
|
||||||
|
ELSEIF iv_nights >= 14.
|
||||||
|
rv_percent = 15.
|
||||||
|
ELSEIF iv_nights >= 7.
|
||||||
|
rv_percent = 10.
|
||||||
|
ENDIF.
|
||||||
|
ENDMETHOD.
|
||||||
|
|
||||||
|
METHOD net_room_total.
|
||||||
|
DATA lv_total TYPE {{p}}if_hotel_rate=>ty_amount.
|
||||||
|
lv_total = nightly_rate( iv_category ) * room_count( iv_guests ) * iv_nights.
|
||||||
|
DATA lv_discount TYPE {{p}}if_hotel_rate=>ty_amount.
|
||||||
|
lv_discount = lv_total * discount_percent( iv_nights ) / 100.
|
||||||
|
rv_total = lv_total - lv_discount.
|
||||||
|
ENDMETHOD.
|
||||||
|
|
||||||
|
METHOD extras.
|
||||||
|
DATA(lv_guest_nights) = iv_guests * iv_nights.
|
||||||
|
rv_extras = lv_guest_nights * c_city_tax.
|
||||||
|
IF iv_breakfast = abap_true.
|
||||||
|
rv_extras = rv_extras + lv_guest_nights * c_breakfast.
|
||||||
|
ENDIF.
|
||||||
|
ENDMETHOD.
|
||||||
|
ENDCLASS.
|
||||||
76
tasks_gen/eval/G0102/reference/hotel_rate.testclasses.abap
Normal file
76
tasks_gen/eval/G0102/reference/hotel_rate.testclasses.abap
Normal file
@@ -0,0 +1,76 @@
|
|||||||
|
CLASS ltc_hotel_rate DEFINITION FINAL FOR TESTING DURATION SHORT RISK LEVEL HARMLESS.
|
||||||
|
PRIVATE SECTION.
|
||||||
|
DATA mo_cut TYPE REF TO {{p}}if_hotel_rate.
|
||||||
|
METHODS setup.
|
||||||
|
METHODS basic_room FOR TESTING.
|
||||||
|
METHODS invalid_nights FOR TESTING.
|
||||||
|
METHODS invalid_guests FOR TESTING.
|
||||||
|
METHODS invalid_category FOR TESTING.
|
||||||
|
METHODS breakfast_and_tax FOR TESTING.
|
||||||
|
METHODS long_stay_discount FOR TESTING.
|
||||||
|
ENDCLASS.
|
||||||
|
|
||||||
|
|
||||||
|
CLASS ltc_hotel_rate IMPLEMENTATION.
|
||||||
|
METHOD setup.
|
||||||
|
mo_cut = NEW {{p}}hotel_rate( ).
|
||||||
|
ENDMETHOD.
|
||||||
|
|
||||||
|
METHOD basic_room.
|
||||||
|
DATA(ls_result) = mo_cut->calculate( iv_category = {{p}}if_hotel_rate=>c_category-basic
|
||||||
|
iv_nights = 1
|
||||||
|
iv_guests = 1
|
||||||
|
iv_breakfast = abap_false ).
|
||||||
|
cl_abap_unit_assert=>assert_equals( exp = {{p}}if_hotel_rate=>c_reason-ok
|
||||||
|
act = ls_result-reason ).
|
||||||
|
cl_abap_unit_assert=>assert_equals( exp = CONV {{p}}if_hotel_rate=>ty_amount( '93.00' )
|
||||||
|
act = ls_result-price ).
|
||||||
|
ENDMETHOD.
|
||||||
|
|
||||||
|
METHOD invalid_nights.
|
||||||
|
DATA(ls_result) = mo_cut->calculate( iv_category = {{p}}if_hotel_rate=>c_category-comfort
|
||||||
|
iv_nights = 0
|
||||||
|
iv_guests = 2
|
||||||
|
iv_breakfast = abap_false ).
|
||||||
|
cl_abap_unit_assert=>assert_equals( exp = {{p}}if_hotel_rate=>c_reason-nights
|
||||||
|
act = ls_result-reason ).
|
||||||
|
cl_abap_unit_assert=>assert_equals( exp = CONV {{p}}if_hotel_rate=>ty_amount( '0.00' )
|
||||||
|
act = ls_result-price ).
|
||||||
|
ENDMETHOD.
|
||||||
|
|
||||||
|
METHOD invalid_guests.
|
||||||
|
DATA(ls_result) = mo_cut->calculate( iv_category = {{p}}if_hotel_rate=>c_category-basic
|
||||||
|
iv_nights = 4
|
||||||
|
iv_guests = 0
|
||||||
|
iv_breakfast = abap_false ).
|
||||||
|
cl_abap_unit_assert=>assert_equals( exp = {{p}}if_hotel_rate=>c_reason-guests
|
||||||
|
act = ls_result-reason ).
|
||||||
|
ENDMETHOD.
|
||||||
|
|
||||||
|
METHOD invalid_category.
|
||||||
|
DATA(ls_result) = mo_cut->calculate( iv_category = 'Z'
|
||||||
|
iv_nights = 4
|
||||||
|
iv_guests = 2
|
||||||
|
iv_breakfast = abap_true ).
|
||||||
|
cl_abap_unit_assert=>assert_equals( exp = {{p}}if_hotel_rate=>c_reason-category
|
||||||
|
act = ls_result-reason ).
|
||||||
|
ENDMETHOD.
|
||||||
|
|
||||||
|
METHOD breakfast_and_tax.
|
||||||
|
DATA(ls_result) = mo_cut->calculate( iv_category = {{p}}if_hotel_rate=>c_category-basic
|
||||||
|
iv_nights = 2
|
||||||
|
iv_guests = 2
|
||||||
|
iv_breakfast = abap_true ).
|
||||||
|
cl_abap_unit_assert=>assert_equals( exp = CONV {{p}}if_hotel_rate=>ty_amount( '242.00' )
|
||||||
|
act = ls_result-price ).
|
||||||
|
ENDMETHOD.
|
||||||
|
|
||||||
|
METHOD long_stay_discount.
|
||||||
|
DATA(ls_result) = mo_cut->calculate( iv_category = {{p}}if_hotel_rate=>c_category-comfort
|
||||||
|
iv_nights = 14
|
||||||
|
iv_guests = 2
|
||||||
|
iv_breakfast = abap_false ).
|
||||||
|
cl_abap_unit_assert=>assert_equals( exp = CONV {{p}}if_hotel_rate=>ty_amount( '1750.00' )
|
||||||
|
act = ls_result-price ).
|
||||||
|
ENDMETHOD.
|
||||||
|
ENDCLASS.
|
||||||
29
tasks_gen/eval/G0102/seed/if_hotel_rate.intf.abap
Normal file
29
tasks_gen/eval/G0102/seed/if_hotel_rate.intf.abap
Normal file
@@ -0,0 +1,29 @@
|
|||||||
|
INTERFACE {{p}}if_hotel_rate PUBLIC.
|
||||||
|
TYPES ty_category TYPE c LENGTH 1.
|
||||||
|
TYPES ty_reason TYPE c LENGTH 10.
|
||||||
|
TYPES ty_amount TYPE p LENGTH 10 DECIMALS 2.
|
||||||
|
TYPES:
|
||||||
|
BEGIN OF ty_result,
|
||||||
|
reason TYPE ty_reason,
|
||||||
|
price TYPE ty_amount,
|
||||||
|
END OF ty_result.
|
||||||
|
CONSTANTS:
|
||||||
|
BEGIN OF c_reason,
|
||||||
|
ok TYPE ty_reason VALUE 'OK',
|
||||||
|
nights TYPE ty_reason VALUE 'NIGHTS',
|
||||||
|
guests TYPE ty_reason VALUE 'GUESTS',
|
||||||
|
category TYPE ty_reason VALUE 'CATEGORY',
|
||||||
|
END OF c_reason.
|
||||||
|
CONSTANTS:
|
||||||
|
BEGIN OF c_category,
|
||||||
|
basic TYPE ty_category VALUE 'S',
|
||||||
|
comfort TYPE ty_category VALUE 'C',
|
||||||
|
suite TYPE ty_category VALUE 'U',
|
||||||
|
END OF c_category.
|
||||||
|
METHODS calculate
|
||||||
|
IMPORTING iv_category TYPE ty_category
|
||||||
|
iv_nights TYPE i
|
||||||
|
iv_guests TYPE i
|
||||||
|
iv_breakfast TYPE abap_bool
|
||||||
|
RETURNING VALUE(rs_result) TYPE ty_result.
|
||||||
|
ENDINTERFACE.
|
||||||
71
tasks_gen/eval/G0102/spec.md
Normal file
71
tasks_gen/eval/G0102/spec.md
Normal file
@@ -0,0 +1,71 @@
|
|||||||
|
# 1. Goal
|
||||||
|
Calculate the price of a hotel stay. A booking program calls the calculation
|
||||||
|
before it shows the price to the guest. The program needs one reason code for
|
||||||
|
each invalid input.
|
||||||
|
|
||||||
|
# 2. Open questions
|
||||||
|
None.
|
||||||
|
|
||||||
|
# 3. Context
|
||||||
|
- The interface {{P}}IF_HOTEL_RATE exists in package $TMP. It is active.
|
||||||
|
- The interface has these types:
|
||||||
|
- TY_CATEGORY: character, length 1.
|
||||||
|
- TY_REASON: character, length 10.
|
||||||
|
- TY_AMOUNT: packed number, length 10, 2 decimals.
|
||||||
|
- TY_RESULT: structure with the components REASON (TY_REASON) and
|
||||||
|
PRICE (TY_AMOUNT).
|
||||||
|
- The interface has these constants:
|
||||||
|
- C_REASON: OK, NIGHTS, GUESTS, CATEGORY.
|
||||||
|
- C_CATEGORY: BASIC 'S', COMFORT 'C', SUITE 'U'.
|
||||||
|
- The interface has one method:
|
||||||
|
CALCULATE
|
||||||
|
IMPORTING iv_category TYPE ty_category
|
||||||
|
iv_nights TYPE i
|
||||||
|
iv_guests TYPE i
|
||||||
|
iv_breakfast TYPE abap_bool
|
||||||
|
RETURNING VALUE(rs_result) TYPE ty_result.
|
||||||
|
|
||||||
|
# 4. Contract
|
||||||
|
- Create the class {{P}}HOTEL_RATE in package $TMP.
|
||||||
|
- The class is public, final, and has a public constructor without parameters.
|
||||||
|
- The class implements {{P}}IF_HOTEL_RATE.
|
||||||
|
- Do not add other public methods.
|
||||||
|
|
||||||
|
# 5. Business rules
|
||||||
|
Check the input in this sequence. Return the reason of the first check that
|
||||||
|
fails and the price 0.
|
||||||
|
1. If IV_NIGHTS is less than 1, return NIGHTS.
|
||||||
|
2. If IV_GUESTS is less than 1, return GUESTS.
|
||||||
|
3. If IV_CATEGORY is not BASIC, COMFORT or SUITE, return CATEGORY.
|
||||||
|
4. Else return OK and calculate the price.
|
||||||
|
|
||||||
|
Calculate the price in this sequence:
|
||||||
|
1. One room takes at most 2 guests. The number of rooms is the number of guests
|
||||||
|
divided by 2, rounded up.
|
||||||
|
2. The price of one room for one night is 90.00 for BASIC, 140.00 for COMFORT
|
||||||
|
and 260.00 for SUITE.
|
||||||
|
3. The room total is the number of rooms multiplied by the number of nights
|
||||||
|
multiplied by the price of one room for one night.
|
||||||
|
4. Long stay discount on the room total:
|
||||||
|
- 28 nights or more: 20 %
|
||||||
|
- 14 nights or more: 15 %
|
||||||
|
- 7 nights or more: 10 %
|
||||||
|
- less than 7 nights: no discount
|
||||||
|
The discounted room total is the room total minus the discount.
|
||||||
|
5. Breakfast costs 12.50 for one guest for one night. Add it if IV_BREAKFAST is
|
||||||
|
true.
|
||||||
|
6. City tax costs 3.00 for one guest for one night. Add it always.
|
||||||
|
7. The price is the discounted room total plus breakfast plus city tax.
|
||||||
|
|
||||||
|
All amounts are exact to two decimals.
|
||||||
|
|
||||||
|
# 6. Constraints
|
||||||
|
- Release target: 8.16.
|
||||||
|
- Coding standards: Clean ABAP. Method length below 40 statements. No global
|
||||||
|
variables. No comment that restates the code.
|
||||||
|
- Out of scope: do not change {{P}}IF_HOTEL_RATE.
|
||||||
|
|
||||||
|
# 7. Acceptance
|
||||||
|
- The class is active and has no syntax error.
|
||||||
|
- The hidden tests pass.
|
||||||
|
- Write your own ABAP Unit tests for the class.
|
||||||
51
tasks_gen/eval/G0102/task.json
Normal file
51
tasks_gen/eval/G0102/task.json
Normal file
@@ -0,0 +1,51 @@
|
|||||||
|
{
|
||||||
|
"id": "G0102",
|
||||||
|
"category": "A",
|
||||||
|
"object_type": "CLAS",
|
||||||
|
"difficulty": 2,
|
||||||
|
"release_target": "v816",
|
||||||
|
"expected_outcome": "implement",
|
||||||
|
"budget": {
|
||||||
|
"max_tool_calls": 60,
|
||||||
|
"max_activations": 15
|
||||||
|
},
|
||||||
|
"seed": [
|
||||||
|
{
|
||||||
|
"type": "INTF",
|
||||||
|
"name": "{{P}}IF_HOTEL_RATE",
|
||||||
|
"file": "seed/if_hotel_rate.intf.abap",
|
||||||
|
"description": "Hotel rate contract: types, reason codes, category codes and the calculate signature"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"contract": [
|
||||||
|
{
|
||||||
|
"type": "CLAS",
|
||||||
|
"name": "{{P}}HOTEL_RATE",
|
||||||
|
"implements": "{{P}}IF_HOTEL_RATE"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"out_of_scope": [
|
||||||
|
"{{P}}IF_HOTEL_RATE"
|
||||||
|
],
|
||||||
|
"hidden_tests": [
|
||||||
|
{
|
||||||
|
"type": "CLAS",
|
||||||
|
"name": "{{P}}T13_HIDDEN",
|
||||||
|
"file": "hidden/t13_hidden.clas.abap",
|
||||||
|
"description": "T13 hidden tests for the hotel rate calculation"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"reference": [
|
||||||
|
{
|
||||||
|
"type": "CLAS",
|
||||||
|
"name": "{{P}}HOTEL_RATE",
|
||||||
|
"file": "reference/hotel_rate.clas.abap",
|
||||||
|
"description": "Hotel rate calculator",
|
||||||
|
"testclasses_file": "reference/hotel_rate.testclasses.abap"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"craft_checks": [
|
||||||
|
"method_length",
|
||||||
|
"db_operation_in_loop"
|
||||||
|
]
|
||||||
|
}
|
||||||
68
tasks_gen/eval/G0103/faulty/m0_overdue_fine.clas.abap
Normal file
68
tasks_gen/eval/G0103/faulty/m0_overdue_fine.clas.abap
Normal file
@@ -0,0 +1,68 @@
|
|||||||
|
CLASS {{p}}overdue_fine DEFINITION PUBLIC FINAL CREATE PUBLIC.
|
||||||
|
PUBLIC SECTION.
|
||||||
|
TYPES ty_media TYPE c LENGTH 8.
|
||||||
|
TYPES ty_amount TYPE p LENGTH 8 DECIMALS 2.
|
||||||
|
TYPES:
|
||||||
|
BEGIN OF ty_result,
|
||||||
|
days_overdue TYPE i,
|
||||||
|
chargeable_days TYPE i,
|
||||||
|
fine TYPE ty_amount,
|
||||||
|
END OF ty_result.
|
||||||
|
|
||||||
|
METHODS calculate
|
||||||
|
IMPORTING iv_due_date TYPE d
|
||||||
|
iv_return_date TYPE d
|
||||||
|
iv_media TYPE ty_media
|
||||||
|
RETURNING VALUE(rs_result) TYPE ty_result.
|
||||||
|
|
||||||
|
PRIVATE SECTION.
|
||||||
|
TYPES:
|
||||||
|
BEGIN OF ty_media_rule,
|
||||||
|
media TYPE ty_media,
|
||||||
|
rate TYPE ty_amount,
|
||||||
|
grace_days TYPE i,
|
||||||
|
END OF ty_media_rule,
|
||||||
|
tt_media_rule TYPE HASHED TABLE OF ty_media_rule WITH UNIQUE KEY media.
|
||||||
|
|
||||||
|
CONSTANTS:
|
||||||
|
c_max_fine TYPE ty_amount VALUE '25.00',
|
||||||
|
c_reminder_fee TYPE ty_amount VALUE '5.00',
|
||||||
|
c_reminder_day TYPE i VALUE 30.
|
||||||
|
|
||||||
|
METHODS media_rule
|
||||||
|
IMPORTING iv_media TYPE ty_media
|
||||||
|
RETURNING VALUE(rs_rule) TYPE ty_media_rule.
|
||||||
|
ENDCLASS.
|
||||||
|
|
||||||
|
|
||||||
|
CLASS {{p}}overdue_fine IMPLEMENTATION.
|
||||||
|
METHOD calculate.
|
||||||
|
rs_result-days_overdue = iv_return_date - iv_due_date.
|
||||||
|
IF rs_result-days_overdue > 0.
|
||||||
|
CLEAR rs_result.
|
||||||
|
RETURN.
|
||||||
|
ENDIF.
|
||||||
|
|
||||||
|
DATA(ls_rule) = media_rule( iv_media ).
|
||||||
|
IF ls_rule IS INITIAL.
|
||||||
|
RETURN.
|
||||||
|
ENDIF.
|
||||||
|
|
||||||
|
rs_result-chargeable_days = nmax( val1 = rs_result-days_overdue - ls_rule-grace_days
|
||||||
|
val2 = 0 ).
|
||||||
|
rs_result-fine = rs_result-chargeable_days * ls_rule-rate.
|
||||||
|
IF rs_result-days_overdue > c_reminder_day.
|
||||||
|
rs_result-fine = rs_result-fine + c_reminder_fee.
|
||||||
|
ENDIF.
|
||||||
|
rs_result-fine = nmin( val1 = rs_result-fine
|
||||||
|
val2 = c_max_fine ).
|
||||||
|
ENDMETHOD.
|
||||||
|
|
||||||
|
METHOD media_rule.
|
||||||
|
DATA(lt_rules) = VALUE tt_media_rule(
|
||||||
|
( media = 'BOOK' rate = '0.30' grace_days = 7 )
|
||||||
|
( media = 'DVD' rate = '1.50' grace_days = 2 )
|
||||||
|
( media = 'GAME' rate = '2.50' grace_days = 0 ) ).
|
||||||
|
READ TABLE lt_rules INTO rs_rule WITH TABLE KEY media = iv_media.
|
||||||
|
ENDMETHOD.
|
||||||
|
ENDCLASS.
|
||||||
68
tasks_gen/eval/G0103/faulty/m1_overdue_fine.clas.abap
Normal file
68
tasks_gen/eval/G0103/faulty/m1_overdue_fine.clas.abap
Normal file
@@ -0,0 +1,68 @@
|
|||||||
|
CLASS {{p}}overdue_fine DEFINITION PUBLIC FINAL CREATE PUBLIC.
|
||||||
|
PUBLIC SECTION.
|
||||||
|
TYPES ty_media TYPE c LENGTH 8.
|
||||||
|
TYPES ty_amount TYPE p LENGTH 8 DECIMALS 2.
|
||||||
|
TYPES:
|
||||||
|
BEGIN OF ty_result,
|
||||||
|
days_overdue TYPE i,
|
||||||
|
chargeable_days TYPE i,
|
||||||
|
fine TYPE ty_amount,
|
||||||
|
END OF ty_result.
|
||||||
|
|
||||||
|
METHODS calculate
|
||||||
|
IMPORTING iv_due_date TYPE d
|
||||||
|
iv_return_date TYPE d
|
||||||
|
iv_media TYPE ty_media
|
||||||
|
RETURNING VALUE(rs_result) TYPE ty_result.
|
||||||
|
|
||||||
|
PRIVATE SECTION.
|
||||||
|
TYPES:
|
||||||
|
BEGIN OF ty_media_rule,
|
||||||
|
media TYPE ty_media,
|
||||||
|
rate TYPE ty_amount,
|
||||||
|
grace_days TYPE i,
|
||||||
|
END OF ty_media_rule,
|
||||||
|
tt_media_rule TYPE HASHED TABLE OF ty_media_rule WITH UNIQUE KEY media.
|
||||||
|
|
||||||
|
CONSTANTS:
|
||||||
|
c_max_fine TYPE ty_amount VALUE '25.00',
|
||||||
|
c_reminder_fee TYPE ty_amount VALUE '5.00',
|
||||||
|
c_reminder_day TYPE i VALUE 30.
|
||||||
|
|
||||||
|
METHODS media_rule
|
||||||
|
IMPORTING iv_media TYPE ty_media
|
||||||
|
RETURNING VALUE(rs_rule) TYPE ty_media_rule.
|
||||||
|
ENDCLASS.
|
||||||
|
|
||||||
|
|
||||||
|
CLASS {{p}}overdue_fine IMPLEMENTATION.
|
||||||
|
METHOD calculate.
|
||||||
|
rs_result-days_overdue = iv_return_date - iv_due_date.
|
||||||
|
IF rs_result-days_overdue <= 0.
|
||||||
|
CLEAR rs_result.
|
||||||
|
RETURN.
|
||||||
|
ENDIF.
|
||||||
|
|
||||||
|
DATA(ls_rule) = media_rule( iv_media ).
|
||||||
|
IF ls_rule IS INITIAL.
|
||||||
|
RETURN.
|
||||||
|
ENDIF.
|
||||||
|
|
||||||
|
rs_result-chargeable_days = nmax( val1 = rs_result-days_overdue + ls_rule-grace_days
|
||||||
|
val2 = 0 ).
|
||||||
|
rs_result-fine = rs_result-chargeable_days * ls_rule-rate.
|
||||||
|
IF rs_result-days_overdue > c_reminder_day.
|
||||||
|
rs_result-fine = rs_result-fine + c_reminder_fee.
|
||||||
|
ENDIF.
|
||||||
|
rs_result-fine = nmin( val1 = rs_result-fine
|
||||||
|
val2 = c_max_fine ).
|
||||||
|
ENDMETHOD.
|
||||||
|
|
||||||
|
METHOD media_rule.
|
||||||
|
DATA(lt_rules) = VALUE tt_media_rule(
|
||||||
|
( media = 'BOOK' rate = '0.30' grace_days = 7 )
|
||||||
|
( media = 'DVD' rate = '1.50' grace_days = 2 )
|
||||||
|
( media = 'GAME' rate = '2.50' grace_days = 0 ) ).
|
||||||
|
READ TABLE lt_rules INTO rs_rule WITH TABLE KEY media = iv_media.
|
||||||
|
ENDMETHOD.
|
||||||
|
ENDCLASS.
|
||||||
68
tasks_gen/eval/G0103/faulty/m2_overdue_fine.clas.abap
Normal file
68
tasks_gen/eval/G0103/faulty/m2_overdue_fine.clas.abap
Normal file
@@ -0,0 +1,68 @@
|
|||||||
|
CLASS {{p}}overdue_fine DEFINITION PUBLIC FINAL CREATE PUBLIC.
|
||||||
|
PUBLIC SECTION.
|
||||||
|
TYPES ty_media TYPE c LENGTH 8.
|
||||||
|
TYPES ty_amount TYPE p LENGTH 8 DECIMALS 2.
|
||||||
|
TYPES:
|
||||||
|
BEGIN OF ty_result,
|
||||||
|
days_overdue TYPE i,
|
||||||
|
chargeable_days TYPE i,
|
||||||
|
fine TYPE ty_amount,
|
||||||
|
END OF ty_result.
|
||||||
|
|
||||||
|
METHODS calculate
|
||||||
|
IMPORTING iv_due_date TYPE d
|
||||||
|
iv_return_date TYPE d
|
||||||
|
iv_media TYPE ty_media
|
||||||
|
RETURNING VALUE(rs_result) TYPE ty_result.
|
||||||
|
|
||||||
|
PRIVATE SECTION.
|
||||||
|
TYPES:
|
||||||
|
BEGIN OF ty_media_rule,
|
||||||
|
media TYPE ty_media,
|
||||||
|
rate TYPE ty_amount,
|
||||||
|
grace_days TYPE i,
|
||||||
|
END OF ty_media_rule,
|
||||||
|
tt_media_rule TYPE HASHED TABLE OF ty_media_rule WITH UNIQUE KEY media.
|
||||||
|
|
||||||
|
CONSTANTS:
|
||||||
|
c_max_fine TYPE ty_amount VALUE '25.00',
|
||||||
|
c_reminder_fee TYPE ty_amount VALUE '5.00',
|
||||||
|
c_reminder_day TYPE i VALUE 30.
|
||||||
|
|
||||||
|
METHODS media_rule
|
||||||
|
IMPORTING iv_media TYPE ty_media
|
||||||
|
RETURNING VALUE(rs_rule) TYPE ty_media_rule.
|
||||||
|
ENDCLASS.
|
||||||
|
|
||||||
|
|
||||||
|
CLASS {{p}}overdue_fine IMPLEMENTATION.
|
||||||
|
METHOD calculate.
|
||||||
|
rs_result-days_overdue = iv_return_date - iv_due_date.
|
||||||
|
IF rs_result-days_overdue <= 0.
|
||||||
|
CLEAR rs_result.
|
||||||
|
RETURN.
|
||||||
|
ENDIF.
|
||||||
|
|
||||||
|
DATA(ls_rule) = media_rule( iv_media ).
|
||||||
|
IF ls_rule IS INITIAL.
|
||||||
|
RETURN.
|
||||||
|
ENDIF.
|
||||||
|
|
||||||
|
rs_result-chargeable_days = nmax( val1 = rs_result-days_overdue - ls_rule-grace_days
|
||||||
|
val2 = 0 ).
|
||||||
|
rs_result-fine = rs_result-chargeable_days / ls_rule-rate.
|
||||||
|
IF rs_result-days_overdue > c_reminder_day.
|
||||||
|
rs_result-fine = rs_result-fine + c_reminder_fee.
|
||||||
|
ENDIF.
|
||||||
|
rs_result-fine = nmin( val1 = rs_result-fine
|
||||||
|
val2 = c_max_fine ).
|
||||||
|
ENDMETHOD.
|
||||||
|
|
||||||
|
METHOD media_rule.
|
||||||
|
DATA(lt_rules) = VALUE tt_media_rule(
|
||||||
|
( media = 'BOOK' rate = '0.30' grace_days = 7 )
|
||||||
|
( media = 'DVD' rate = '1.50' grace_days = 2 )
|
||||||
|
( media = 'GAME' rate = '2.50' grace_days = 0 ) ).
|
||||||
|
READ TABLE lt_rules INTO rs_rule WITH TABLE KEY media = iv_media.
|
||||||
|
ENDMETHOD.
|
||||||
|
ENDCLASS.
|
||||||
68
tasks_gen/eval/G0103/faulty/m3_overdue_fine.clas.abap
Normal file
68
tasks_gen/eval/G0103/faulty/m3_overdue_fine.clas.abap
Normal file
@@ -0,0 +1,68 @@
|
|||||||
|
CLASS {{p}}overdue_fine DEFINITION PUBLIC FINAL CREATE PUBLIC.
|
||||||
|
PUBLIC SECTION.
|
||||||
|
TYPES ty_media TYPE c LENGTH 8.
|
||||||
|
TYPES ty_amount TYPE p LENGTH 8 DECIMALS 2.
|
||||||
|
TYPES:
|
||||||
|
BEGIN OF ty_result,
|
||||||
|
days_overdue TYPE i,
|
||||||
|
chargeable_days TYPE i,
|
||||||
|
fine TYPE ty_amount,
|
||||||
|
END OF ty_result.
|
||||||
|
|
||||||
|
METHODS calculate
|
||||||
|
IMPORTING iv_due_date TYPE d
|
||||||
|
iv_return_date TYPE d
|
||||||
|
iv_media TYPE ty_media
|
||||||
|
RETURNING VALUE(rs_result) TYPE ty_result.
|
||||||
|
|
||||||
|
PRIVATE SECTION.
|
||||||
|
TYPES:
|
||||||
|
BEGIN OF ty_media_rule,
|
||||||
|
media TYPE ty_media,
|
||||||
|
rate TYPE ty_amount,
|
||||||
|
grace_days TYPE i,
|
||||||
|
END OF ty_media_rule,
|
||||||
|
tt_media_rule TYPE HASHED TABLE OF ty_media_rule WITH UNIQUE KEY media.
|
||||||
|
|
||||||
|
CONSTANTS:
|
||||||
|
c_max_fine TYPE ty_amount VALUE '25.00',
|
||||||
|
c_reminder_fee TYPE ty_amount VALUE '5.00',
|
||||||
|
c_reminder_day TYPE i VALUE 30.
|
||||||
|
|
||||||
|
METHODS media_rule
|
||||||
|
IMPORTING iv_media TYPE ty_media
|
||||||
|
RETURNING VALUE(rs_rule) TYPE ty_media_rule.
|
||||||
|
ENDCLASS.
|
||||||
|
|
||||||
|
|
||||||
|
CLASS {{p}}overdue_fine IMPLEMENTATION.
|
||||||
|
METHOD calculate.
|
||||||
|
rs_result-days_overdue = iv_return_date - iv_due_date.
|
||||||
|
IF rs_result-days_overdue <= 0.
|
||||||
|
CLEAR rs_result.
|
||||||
|
RETURN.
|
||||||
|
ENDIF.
|
||||||
|
|
||||||
|
DATA(ls_rule) = media_rule( iv_media ).
|
||||||
|
IF ls_rule IS INITIAL.
|
||||||
|
RETURN.
|
||||||
|
ENDIF.
|
||||||
|
|
||||||
|
rs_result-chargeable_days = nmax( val1 = rs_result-days_overdue - ls_rule-grace_days
|
||||||
|
val2 = 0 ).
|
||||||
|
rs_result-fine = rs_result-chargeable_days * ls_rule-rate.
|
||||||
|
IF rs_result-days_overdue > c_reminder_day.
|
||||||
|
rs_result-fine = rs_result-fine - c_reminder_fee.
|
||||||
|
ENDIF.
|
||||||
|
rs_result-fine = nmin( val1 = rs_result-fine
|
||||||
|
val2 = c_max_fine ).
|
||||||
|
ENDMETHOD.
|
||||||
|
|
||||||
|
METHOD media_rule.
|
||||||
|
DATA(lt_rules) = VALUE tt_media_rule(
|
||||||
|
( media = 'BOOK' rate = '0.30' grace_days = 7 )
|
||||||
|
( media = 'DVD' rate = '1.50' grace_days = 2 )
|
||||||
|
( media = 'GAME' rate = '2.50' grace_days = 0 ) ).
|
||||||
|
READ TABLE lt_rules INTO rs_rule WITH TABLE KEY media = iv_media.
|
||||||
|
ENDMETHOD.
|
||||||
|
ENDCLASS.
|
||||||
68
tasks_gen/eval/G0103/faulty/m4_overdue_fine.clas.abap
Normal file
68
tasks_gen/eval/G0103/faulty/m4_overdue_fine.clas.abap
Normal file
@@ -0,0 +1,68 @@
|
|||||||
|
CLASS {{p}}overdue_fine DEFINITION PUBLIC FINAL CREATE PUBLIC.
|
||||||
|
PUBLIC SECTION.
|
||||||
|
TYPES ty_media TYPE c LENGTH 8.
|
||||||
|
TYPES ty_amount TYPE p LENGTH 8 DECIMALS 2.
|
||||||
|
TYPES:
|
||||||
|
BEGIN OF ty_result,
|
||||||
|
days_overdue TYPE i,
|
||||||
|
chargeable_days TYPE i,
|
||||||
|
fine TYPE ty_amount,
|
||||||
|
END OF ty_result.
|
||||||
|
|
||||||
|
METHODS calculate
|
||||||
|
IMPORTING iv_due_date TYPE d
|
||||||
|
iv_return_date TYPE d
|
||||||
|
iv_media TYPE ty_media
|
||||||
|
RETURNING VALUE(rs_result) TYPE ty_result.
|
||||||
|
|
||||||
|
PRIVATE SECTION.
|
||||||
|
TYPES:
|
||||||
|
BEGIN OF ty_media_rule,
|
||||||
|
media TYPE ty_media,
|
||||||
|
rate TYPE ty_amount,
|
||||||
|
grace_days TYPE i,
|
||||||
|
END OF ty_media_rule,
|
||||||
|
tt_media_rule TYPE HASHED TABLE OF ty_media_rule WITH UNIQUE KEY media.
|
||||||
|
|
||||||
|
CONSTANTS:
|
||||||
|
c_max_fine TYPE ty_amount VALUE '25.00',
|
||||||
|
c_reminder_fee TYPE ty_amount VALUE '5.00',
|
||||||
|
c_reminder_day TYPE i VALUE 30.
|
||||||
|
|
||||||
|
METHODS media_rule
|
||||||
|
IMPORTING iv_media TYPE ty_media
|
||||||
|
RETURNING VALUE(rs_rule) TYPE ty_media_rule.
|
||||||
|
ENDCLASS.
|
||||||
|
|
||||||
|
|
||||||
|
CLASS {{p}}overdue_fine IMPLEMENTATION.
|
||||||
|
METHOD calculate.
|
||||||
|
rs_result-days_overdue = iv_return_date - iv_due_date.
|
||||||
|
IF rs_result-days_overdue <= 0.
|
||||||
|
CLEAR rs_result.
|
||||||
|
RETURN.
|
||||||
|
ENDIF.
|
||||||
|
|
||||||
|
DATA(ls_rule) = media_rule( iv_media ).
|
||||||
|
IF ls_rule IS INITIAL.
|
||||||
|
RETURN.
|
||||||
|
ENDIF.
|
||||||
|
|
||||||
|
rs_result-chargeable_days = nmax( val1 = rs_result-days_overdue - ls_rule-grace_days
|
||||||
|
val2 = 0 ).
|
||||||
|
rs_result-fine = rs_result-chargeable_days * ls_rule-rate.
|
||||||
|
IF rs_result-days_overdue > c_reminder_day.
|
||||||
|
rs_result-fine = rs_result-fine + c_reminder_fee.
|
||||||
|
ENDIF.
|
||||||
|
rs_result-fine = nmin( val1 = rs_result-fine
|
||||||
|
val2 = c_max_fine ).
|
||||||
|
ENDMETHOD.
|
||||||
|
|
||||||
|
METHOD media_rule.
|
||||||
|
DATA(lt_rules) = VALUE tt_media_rule(
|
||||||
|
( media = 'BOOK' rate = '0.30' grace_days = 8 )
|
||||||
|
( media = 'DVD' rate = '1.50' grace_days = 2 )
|
||||||
|
( media = 'GAME' rate = '2.50' grace_days = 0 ) ).
|
||||||
|
READ TABLE lt_rules INTO rs_rule WITH TABLE KEY media = iv_media.
|
||||||
|
ENDMETHOD.
|
||||||
|
ENDCLASS.
|
||||||
19
tasks_gen/eval/G0103/generation.json
Normal file
19
tasks_gen/eval/G0103/generation.json
Normal file
@@ -0,0 +1,19 @@
|
|||||||
|
{
|
||||||
|
"id": "G0103",
|
||||||
|
"pool": "eval",
|
||||||
|
"object_type": "CLAS",
|
||||||
|
"category": "A",
|
||||||
|
"attempts": [
|
||||||
|
{
|
||||||
|
"stage": "validate",
|
||||||
|
"oracle": 100.0,
|
||||||
|
"null": 0,
|
||||||
|
"mutation": {
|
||||||
|
"valid": 5,
|
||||||
|
"killed": 5,
|
||||||
|
"ok": true
|
||||||
|
}
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"accepted": true
|
||||||
|
}
|
||||||
103
tasks_gen/eval/G0103/hidden/t02_hidden.clas.abap
Normal file
103
tasks_gen/eval/G0103/hidden/t02_hidden.clas.abap
Normal file
@@ -0,0 +1,103 @@
|
|||||||
|
CLASS {{p}}t02_hidden DEFINITION PUBLIC FINAL CREATE PUBLIC
|
||||||
|
FOR TESTING DURATION SHORT RISK LEVEL HARMLESS.
|
||||||
|
PRIVATE SECTION.
|
||||||
|
DATA mo_cut TYPE REF TO {{p}}overdue_fine.
|
||||||
|
METHODS setup.
|
||||||
|
METHODS assert_fine
|
||||||
|
IMPORTING iv_due TYPE d
|
||||||
|
iv_return TYPE d
|
||||||
|
iv_media TYPE {{p}}overdue_fine=>ty_media
|
||||||
|
iv_days TYPE i
|
||||||
|
iv_charge TYPE i
|
||||||
|
iv_fine TYPE {{p}}overdue_fine=>ty_amount.
|
||||||
|
METHODS not_late_no_fine FOR TESTING.
|
||||||
|
METHODS book_in_grace FOR TESTING.
|
||||||
|
METHODS book_over_grace FOR TESTING.
|
||||||
|
METHODS dvd_in_grace FOR TESTING.
|
||||||
|
METHODS dvd_over_grace FOR TESTING.
|
||||||
|
METHODS game_no_grace FOR TESTING.
|
||||||
|
METHODS reminder_fee_added FOR TESTING.
|
||||||
|
METHODS no_reminder_day_30 FOR TESTING.
|
||||||
|
METHODS fine_capped FOR TESTING.
|
||||||
|
METHODS cap_after_reminder FOR TESTING.
|
||||||
|
METHODS unknown_media_no_fine FOR TESTING.
|
||||||
|
ENDCLASS.
|
||||||
|
|
||||||
|
|
||||||
|
CLASS {{p}}t02_hidden IMPLEMENTATION.
|
||||||
|
METHOD setup.
|
||||||
|
mo_cut = NEW {{p}}overdue_fine( ).
|
||||||
|
ENDMETHOD.
|
||||||
|
|
||||||
|
METHOD assert_fine.
|
||||||
|
DATA(ls_result) = mo_cut->calculate( iv_due_date = iv_due
|
||||||
|
iv_return_date = iv_return
|
||||||
|
iv_media = iv_media ).
|
||||||
|
cl_abap_unit_assert=>assert_equals( exp = iv_days
|
||||||
|
act = ls_result-days_overdue
|
||||||
|
msg = |days overdue for { iv_media }| ).
|
||||||
|
cl_abap_unit_assert=>assert_equals( exp = iv_charge
|
||||||
|
act = ls_result-chargeable_days
|
||||||
|
msg = |chargeable days for { iv_media }| ).
|
||||||
|
cl_abap_unit_assert=>assert_equals( exp = iv_fine
|
||||||
|
act = ls_result-fine
|
||||||
|
msg = |fine for { iv_media }| ).
|
||||||
|
ENDMETHOD.
|
||||||
|
|
||||||
|
METHOD not_late_no_fine.
|
||||||
|
assert_fine( iv_due = '20250110' iv_return = '20250109' iv_media = 'BOOK'
|
||||||
|
iv_days = 0 iv_charge = 0 iv_fine = '0.00' ).
|
||||||
|
assert_fine( iv_due = '20250110' iv_return = '20250110' iv_media = 'DVD'
|
||||||
|
iv_days = 0 iv_charge = 0 iv_fine = '0.00' ).
|
||||||
|
ENDMETHOD.
|
||||||
|
|
||||||
|
METHOD book_in_grace.
|
||||||
|
assert_fine( iv_due = '20250101' iv_return = '20250108' iv_media = 'BOOK'
|
||||||
|
iv_days = 7 iv_charge = 0 iv_fine = '0.00' ).
|
||||||
|
ENDMETHOD.
|
||||||
|
|
||||||
|
METHOD book_over_grace.
|
||||||
|
assert_fine( iv_due = '20250101' iv_return = '20250109' iv_media = 'BOOK'
|
||||||
|
iv_days = 8 iv_charge = 1 iv_fine = '0.30' ).
|
||||||
|
ENDMETHOD.
|
||||||
|
|
||||||
|
METHOD dvd_in_grace.
|
||||||
|
assert_fine( iv_due = '20250101' iv_return = '20250103' iv_media = 'DVD'
|
||||||
|
iv_days = 2 iv_charge = 0 iv_fine = '0.00' ).
|
||||||
|
ENDMETHOD.
|
||||||
|
|
||||||
|
METHOD dvd_over_grace.
|
||||||
|
assert_fine( iv_due = '20250101' iv_return = '20250104' iv_media = 'DVD'
|
||||||
|
iv_days = 3 iv_charge = 1 iv_fine = '1.50' ).
|
||||||
|
ENDMETHOD.
|
||||||
|
|
||||||
|
METHOD game_no_grace.
|
||||||
|
assert_fine( iv_due = '20250101' iv_return = '20250102' iv_media = 'GAME'
|
||||||
|
iv_days = 1 iv_charge = 1 iv_fine = '2.50' ).
|
||||||
|
ENDMETHOD.
|
||||||
|
|
||||||
|
METHOD reminder_fee_added.
|
||||||
|
assert_fine( iv_due = '20250101' iv_return = '20250215' iv_media = 'BOOK'
|
||||||
|
iv_days = 45 iv_charge = 38 iv_fine = '16.40' ).
|
||||||
|
ENDMETHOD.
|
||||||
|
|
||||||
|
METHOD no_reminder_day_30.
|
||||||
|
assert_fine( iv_due = '20250101' iv_return = '20250131' iv_media = 'BOOK'
|
||||||
|
iv_days = 30 iv_charge = 23 iv_fine = '6.90' ).
|
||||||
|
ENDMETHOD.
|
||||||
|
|
||||||
|
METHOD fine_capped.
|
||||||
|
assert_fine( iv_due = '20250101' iv_return = '20250113' iv_media = 'GAME'
|
||||||
|
iv_days = 12 iv_charge = 12 iv_fine = '25.00' ).
|
||||||
|
ENDMETHOD.
|
||||||
|
|
||||||
|
METHOD cap_after_reminder.
|
||||||
|
assert_fine( iv_due = '20250101' iv_return = '20250201' iv_media = 'GAME'
|
||||||
|
iv_days = 31 iv_charge = 31 iv_fine = '25.00' ).
|
||||||
|
ENDMETHOD.
|
||||||
|
|
||||||
|
METHOD unknown_media_no_fine.
|
||||||
|
assert_fine( iv_due = '20250101' iv_return = '20250105' iv_media = 'TAPE'
|
||||||
|
iv_days = 4 iv_charge = 0 iv_fine = '0.00' ).
|
||||||
|
ENDMETHOD.
|
||||||
|
ENDCLASS.
|
||||||
77
tasks_gen/eval/G0103/mutation.json
Normal file
77
tasks_gen/eval/G0103/mutation.json
Normal file
@@ -0,0 +1,77 @@
|
|||||||
|
{
|
||||||
|
"task": "G0103",
|
||||||
|
"mutants": [
|
||||||
|
{
|
||||||
|
"object": "{{P}}OVERDUE_FINE",
|
||||||
|
"mutant": "line 41: <= -> > (rel)",
|
||||||
|
"status": "killed",
|
||||||
|
"hidden": "0/11",
|
||||||
|
"failed_tests": [
|
||||||
|
"BOOK_IN_GRACE",
|
||||||
|
"BOOK_OVER_GRACE",
|
||||||
|
"CAP_AFTER_REMINDER",
|
||||||
|
"DVD_IN_GRACE",
|
||||||
|
"DVD_OVER_GRACE",
|
||||||
|
"FINE_CAPPED",
|
||||||
|
"GAME_NO_GRACE",
|
||||||
|
"NOT_LATE_NO_FINE",
|
||||||
|
"NO_REMINDER_DAY_30",
|
||||||
|
"REMINDER_FEE_ADDED",
|
||||||
|
"UNKNOWN_MEDIA_NO_FINE"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"object": "{{P}}OVERDUE_FINE",
|
||||||
|
"mutant": "line 51: - -> + (arith)",
|
||||||
|
"status": "killed",
|
||||||
|
"hidden": "5/11",
|
||||||
|
"failed_tests": [
|
||||||
|
"BOOK_IN_GRACE",
|
||||||
|
"BOOK_OVER_GRACE",
|
||||||
|
"DVD_IN_GRACE",
|
||||||
|
"DVD_OVER_GRACE",
|
||||||
|
"NO_REMINDER_DAY_30",
|
||||||
|
"REMINDER_FEE_ADDED"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"object": "{{P}}OVERDUE_FINE",
|
||||||
|
"mutant": "line 53: * -> / (arith)",
|
||||||
|
"status": "killed",
|
||||||
|
"hidden": "4/11",
|
||||||
|
"failed_tests": [
|
||||||
|
"BOOK_OVER_GRACE",
|
||||||
|
"CAP_AFTER_REMINDER",
|
||||||
|
"DVD_OVER_GRACE",
|
||||||
|
"FINE_CAPPED",
|
||||||
|
"GAME_NO_GRACE",
|
||||||
|
"NO_REMINDER_DAY_30",
|
||||||
|
"REMINDER_FEE_ADDED"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"object": "{{P}}OVERDUE_FINE",
|
||||||
|
"mutant": "line 55: + -> - (arith)",
|
||||||
|
"status": "killed",
|
||||||
|
"hidden": "10/11",
|
||||||
|
"failed_tests": [
|
||||||
|
"REMINDER_FEE_ADDED"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"object": "{{P}}OVERDUE_FINE",
|
||||||
|
"mutant": "line 63: 7 -> 8 (const)",
|
||||||
|
"status": "killed",
|
||||||
|
"hidden": "8/11",
|
||||||
|
"failed_tests": [
|
||||||
|
"BOOK_OVER_GRACE",
|
||||||
|
"NO_REMINDER_DAY_30",
|
||||||
|
"REMINDER_FEE_ADDED"
|
||||||
|
]
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"valid": 5,
|
||||||
|
"killed": 5,
|
||||||
|
"kill_rate": 1.0,
|
||||||
|
"ok": true
|
||||||
|
}
|
||||||
68
tasks_gen/eval/G0103/reference/overdue_fine.clas.abap
Normal file
68
tasks_gen/eval/G0103/reference/overdue_fine.clas.abap
Normal file
@@ -0,0 +1,68 @@
|
|||||||
|
CLASS {{p}}overdue_fine DEFINITION PUBLIC FINAL CREATE PUBLIC.
|
||||||
|
PUBLIC SECTION.
|
||||||
|
TYPES ty_media TYPE c LENGTH 8.
|
||||||
|
TYPES ty_amount TYPE p LENGTH 8 DECIMALS 2.
|
||||||
|
TYPES:
|
||||||
|
BEGIN OF ty_result,
|
||||||
|
days_overdue TYPE i,
|
||||||
|
chargeable_days TYPE i,
|
||||||
|
fine TYPE ty_amount,
|
||||||
|
END OF ty_result.
|
||||||
|
|
||||||
|
METHODS calculate
|
||||||
|
IMPORTING iv_due_date TYPE d
|
||||||
|
iv_return_date TYPE d
|
||||||
|
iv_media TYPE ty_media
|
||||||
|
RETURNING VALUE(rs_result) TYPE ty_result.
|
||||||
|
|
||||||
|
PRIVATE SECTION.
|
||||||
|
TYPES:
|
||||||
|
BEGIN OF ty_media_rule,
|
||||||
|
media TYPE ty_media,
|
||||||
|
rate TYPE ty_amount,
|
||||||
|
grace_days TYPE i,
|
||||||
|
END OF ty_media_rule,
|
||||||
|
tt_media_rule TYPE HASHED TABLE OF ty_media_rule WITH UNIQUE KEY media.
|
||||||
|
|
||||||
|
CONSTANTS:
|
||||||
|
c_max_fine TYPE ty_amount VALUE '25.00',
|
||||||
|
c_reminder_fee TYPE ty_amount VALUE '5.00',
|
||||||
|
c_reminder_day TYPE i VALUE 30.
|
||||||
|
|
||||||
|
METHODS media_rule
|
||||||
|
IMPORTING iv_media TYPE ty_media
|
||||||
|
RETURNING VALUE(rs_rule) TYPE ty_media_rule.
|
||||||
|
ENDCLASS.
|
||||||
|
|
||||||
|
|
||||||
|
CLASS {{p}}overdue_fine IMPLEMENTATION.
|
||||||
|
METHOD calculate.
|
||||||
|
rs_result-days_overdue = iv_return_date - iv_due_date.
|
||||||
|
IF rs_result-days_overdue <= 0.
|
||||||
|
CLEAR rs_result.
|
||||||
|
RETURN.
|
||||||
|
ENDIF.
|
||||||
|
|
||||||
|
DATA(ls_rule) = media_rule( iv_media ).
|
||||||
|
IF ls_rule IS INITIAL.
|
||||||
|
RETURN.
|
||||||
|
ENDIF.
|
||||||
|
|
||||||
|
rs_result-chargeable_days = nmax( val1 = rs_result-days_overdue - ls_rule-grace_days
|
||||||
|
val2 = 0 ).
|
||||||
|
rs_result-fine = rs_result-chargeable_days * ls_rule-rate.
|
||||||
|
IF rs_result-days_overdue > c_reminder_day.
|
||||||
|
rs_result-fine = rs_result-fine + c_reminder_fee.
|
||||||
|
ENDIF.
|
||||||
|
rs_result-fine = nmin( val1 = rs_result-fine
|
||||||
|
val2 = c_max_fine ).
|
||||||
|
ENDMETHOD.
|
||||||
|
|
||||||
|
METHOD media_rule.
|
||||||
|
DATA(lt_rules) = VALUE tt_media_rule(
|
||||||
|
( media = 'BOOK' rate = '0.30' grace_days = 7 )
|
||||||
|
( media = 'DVD' rate = '1.50' grace_days = 2 )
|
||||||
|
( media = 'GAME' rate = '2.50' grace_days = 0 ) ).
|
||||||
|
READ TABLE lt_rules INTO rs_rule WITH TABLE KEY media = iv_media.
|
||||||
|
ENDMETHOD.
|
||||||
|
ENDCLASS.
|
||||||
89
tasks_gen/eval/G0103/reference/overdue_fine.testclasses.abap
Normal file
89
tasks_gen/eval/G0103/reference/overdue_fine.testclasses.abap
Normal file
@@ -0,0 +1,89 @@
|
|||||||
|
CLASS ltc_overdue_fine DEFINITION FINAL FOR TESTING DURATION SHORT RISK LEVEL HARMLESS.
|
||||||
|
PRIVATE SECTION.
|
||||||
|
DATA mo_cut TYPE REF TO {{p}}overdue_fine.
|
||||||
|
METHODS setup.
|
||||||
|
METHODS not_late_no_fine FOR TESTING.
|
||||||
|
METHODS book_in_grace FOR TESTING.
|
||||||
|
METHODS book_over_grace FOR TESTING.
|
||||||
|
METHODS dvd_over_grace FOR TESTING.
|
||||||
|
METHODS game_no_grace FOR TESTING.
|
||||||
|
METHODS reminder_fee FOR TESTING.
|
||||||
|
METHODS fine_is_capped FOR TESTING.
|
||||||
|
METHODS unknown_media FOR TESTING.
|
||||||
|
ENDCLASS.
|
||||||
|
|
||||||
|
|
||||||
|
CLASS ltc_overdue_fine IMPLEMENTATION.
|
||||||
|
METHOD setup.
|
||||||
|
mo_cut = NEW {{p}}overdue_fine( ).
|
||||||
|
ENDMETHOD.
|
||||||
|
|
||||||
|
METHOD not_late_no_fine.
|
||||||
|
DATA(ls_result) = mo_cut->calculate( iv_due_date = '20250110'
|
||||||
|
iv_return_date = '20250109'
|
||||||
|
iv_media = 'BOOK' ).
|
||||||
|
cl_abap_unit_assert=>assert_equals(
|
||||||
|
exp = CONV {{p}}overdue_fine=>ty_amount( '0.00' )
|
||||||
|
act = ls_result-fine ).
|
||||||
|
ENDMETHOD.
|
||||||
|
|
||||||
|
METHOD book_in_grace.
|
||||||
|
DATA(ls_result) = mo_cut->calculate( iv_due_date = '20250101'
|
||||||
|
iv_return_date = '20250108'
|
||||||
|
iv_media = 'BOOK' ).
|
||||||
|
cl_abap_unit_assert=>assert_equals( exp = 0 act = ls_result-chargeable_days ).
|
||||||
|
ENDMETHOD.
|
||||||
|
|
||||||
|
METHOD book_over_grace.
|
||||||
|
DATA(ls_result) = mo_cut->calculate( iv_due_date = '20250101'
|
||||||
|
iv_return_date = '20250109'
|
||||||
|
iv_media = 'BOOK' ).
|
||||||
|
cl_abap_unit_assert=>assert_equals(
|
||||||
|
exp = CONV {{p}}overdue_fine=>ty_amount( '0.30' )
|
||||||
|
act = ls_result-fine ).
|
||||||
|
ENDMETHOD.
|
||||||
|
|
||||||
|
METHOD dvd_over_grace.
|
||||||
|
DATA(ls_result) = mo_cut->calculate( iv_due_date = '20250101'
|
||||||
|
iv_return_date = '20250104'
|
||||||
|
iv_media = 'DVD' ).
|
||||||
|
cl_abap_unit_assert=>assert_equals(
|
||||||
|
exp = CONV {{p}}overdue_fine=>ty_amount( '1.50' )
|
||||||
|
act = ls_result-fine ).
|
||||||
|
ENDMETHOD.
|
||||||
|
|
||||||
|
METHOD game_no_grace.
|
||||||
|
DATA(ls_result) = mo_cut->calculate( iv_due_date = '20250101'
|
||||||
|
iv_return_date = '20250102'
|
||||||
|
iv_media = 'GAME' ).
|
||||||
|
cl_abap_unit_assert=>assert_equals(
|
||||||
|
exp = CONV {{p}}overdue_fine=>ty_amount( '2.50' )
|
||||||
|
act = ls_result-fine ).
|
||||||
|
ENDMETHOD.
|
||||||
|
|
||||||
|
METHOD reminder_fee.
|
||||||
|
DATA(ls_result) = mo_cut->calculate( iv_due_date = '20250101'
|
||||||
|
iv_return_date = '20250215'
|
||||||
|
iv_media = 'BOOK' ).
|
||||||
|
cl_abap_unit_assert=>assert_equals(
|
||||||
|
exp = CONV {{p}}overdue_fine=>ty_amount( '16.40' )
|
||||||
|
act = ls_result-fine ).
|
||||||
|
ENDMETHOD.
|
||||||
|
|
||||||
|
METHOD fine_is_capped.
|
||||||
|
DATA(ls_result) = mo_cut->calculate( iv_due_date = '20250101'
|
||||||
|
iv_return_date = '20250113'
|
||||||
|
iv_media = 'GAME' ).
|
||||||
|
cl_abap_unit_assert=>assert_equals(
|
||||||
|
exp = CONV {{p}}overdue_fine=>ty_amount( '25.00' )
|
||||||
|
act = ls_result-fine ).
|
||||||
|
ENDMETHOD.
|
||||||
|
|
||||||
|
METHOD unknown_media.
|
||||||
|
DATA(ls_result) = mo_cut->calculate( iv_due_date = '20250101'
|
||||||
|
iv_return_date = '20250105'
|
||||||
|
iv_media = 'TAPE' ).
|
||||||
|
cl_abap_unit_assert=>assert_equals( exp = 4 act = ls_result-days_overdue ).
|
||||||
|
cl_abap_unit_assert=>assert_equals( exp = 0 act = ls_result-chargeable_days ).
|
||||||
|
ENDMETHOD.
|
||||||
|
ENDCLASS.
|
||||||
56
tasks_gen/eval/G0103/spec.md
Normal file
56
tasks_gen/eval/G0103/spec.md
Normal file
@@ -0,0 +1,56 @@
|
|||||||
|
# 1. Goal
|
||||||
|
Calculate the overdue fine of a returned library item. The lending desk calls the
|
||||||
|
calculation before it prints the receipt. The result gives the days overdue, the
|
||||||
|
chargeable days, and the fine.
|
||||||
|
|
||||||
|
# 2. Open questions
|
||||||
|
None.
|
||||||
|
|
||||||
|
# 3. Context
|
||||||
|
- Package $TMP contains no object for this task.
|
||||||
|
- The class is new. No other object is necessary.
|
||||||
|
|
||||||
|
# 4. Contract
|
||||||
|
- Create the class {{P}}OVERDUE_FINE in package $TMP.
|
||||||
|
- The class is public and final. You can create it with NEW {{P}}OVERDUE_FINE( )
|
||||||
|
without parameters.
|
||||||
|
- The class has these public types:
|
||||||
|
- TY_MEDIA: character field, length 8.
|
||||||
|
- TY_AMOUNT: packed number, length 8, 2 decimal places.
|
||||||
|
- TY_RESULT: structure with the components DAYS_OVERDUE (type i),
|
||||||
|
CHARGEABLE_DAYS (type i), and FINE (type TY_AMOUNT).
|
||||||
|
- The class has one public method:
|
||||||
|
CALCULATE
|
||||||
|
IMPORTING iv_due_date TYPE d
|
||||||
|
iv_return_date TYPE d
|
||||||
|
iv_media TYPE ty_media
|
||||||
|
RETURNING VALUE(rs_result) TYPE ty_result.
|
||||||
|
- Do not add other public methods or public components.
|
||||||
|
|
||||||
|
# 5. Business rules
|
||||||
|
Apply the rules in this sequence.
|
||||||
|
1. If iv_return_date is earlier than or equal to iv_due_date, return
|
||||||
|
DAYS_OVERDUE = 0, CHARGEABLE_DAYS = 0, and FINE = 0.00. Stop.
|
||||||
|
2. DAYS_OVERDUE is the number of calendar days from iv_due_date to iv_return_date.
|
||||||
|
3. The media code gives the daily rate and the grace days:
|
||||||
|
- BOOK: daily rate 0.30, grace 7 days
|
||||||
|
- DVD: daily rate 1.50, grace 2 days
|
||||||
|
- GAME: daily rate 2.50, grace 0 days
|
||||||
|
Compare the media code exactly. If the media code is not in this list, return
|
||||||
|
CHARGEABLE_DAYS = 0 and FINE = 0.00. Keep DAYS_OVERDUE from rule 2. Stop.
|
||||||
|
4. CHARGEABLE_DAYS is DAYS_OVERDUE minus the grace days. If this value is less
|
||||||
|
than 0, CHARGEABLE_DAYS is 0.
|
||||||
|
5. FINE is CHARGEABLE_DAYS multiplied by the daily rate.
|
||||||
|
6. If DAYS_OVERDUE is greater than 30, add a reminder fee of 5.00 to FINE.
|
||||||
|
7. If FINE is greater than 25.00, FINE is 25.00.
|
||||||
|
|
||||||
|
# 6. Constraints
|
||||||
|
- Release target: SAP_BASIS 816 (ABAP Platform 2025).
|
||||||
|
- Coding standards: Clean ABAP. Method length below 40 statements. No global
|
||||||
|
variables. No comment that restates the code.
|
||||||
|
- Out of scope: no other object.
|
||||||
|
|
||||||
|
# 7. Acceptance
|
||||||
|
- The class is active and has no syntax error.
|
||||||
|
- The hidden tests pass.
|
||||||
|
- Write your own ABAP Unit tests for the class.
|
||||||
41
tasks_gen/eval/G0103/task.json
Normal file
41
tasks_gen/eval/G0103/task.json
Normal file
@@ -0,0 +1,41 @@
|
|||||||
|
{
|
||||||
|
"id": "G0103",
|
||||||
|
"category": "A",
|
||||||
|
"object_type": "CLAS",
|
||||||
|
"difficulty": 2,
|
||||||
|
"release_target": "v816",
|
||||||
|
"expected_outcome": "implement",
|
||||||
|
"budget": {
|
||||||
|
"max_tool_calls": 40,
|
||||||
|
"max_activations": 10
|
||||||
|
},
|
||||||
|
"seed": [],
|
||||||
|
"contract": [
|
||||||
|
{
|
||||||
|
"type": "CLAS",
|
||||||
|
"name": "{{P}}OVERDUE_FINE"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"out_of_scope": [],
|
||||||
|
"hidden_tests": [
|
||||||
|
{
|
||||||
|
"type": "CLAS",
|
||||||
|
"name": "{{P}}T02_HIDDEN",
|
||||||
|
"file": "hidden/t02_hidden.clas.abap",
|
||||||
|
"description": "T02 hidden tests for the overdue fine calculation"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"reference": [
|
||||||
|
{
|
||||||
|
"type": "CLAS",
|
||||||
|
"name": "{{P}}OVERDUE_FINE",
|
||||||
|
"file": "reference/overdue_fine.clas.abap",
|
||||||
|
"description": "Overdue fine calculation for a library item",
|
||||||
|
"testclasses_file": "reference/overdue_fine.testclasses.abap"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"craft_checks": [
|
||||||
|
"method_length",
|
||||||
|
"db_operation_in_loop"
|
||||||
|
]
|
||||||
|
}
|
||||||
96
tasks_gen/eval/G0104/faulty/m0_insurance_premium.clas.abap
Normal file
96
tasks_gen/eval/G0104/faulty/m0_insurance_premium.clas.abap
Normal file
@@ -0,0 +1,96 @@
|
|||||||
|
CLASS {{p}}insurance_premium DEFINITION PUBLIC FINAL CREATE PUBLIC.
|
||||||
|
PUBLIC SECTION.
|
||||||
|
TYPES:
|
||||||
|
ty_region TYPE c LENGTH 2,
|
||||||
|
ty_premium TYPE p LENGTH 8 DECIMALS 2.
|
||||||
|
METHODS calculate_premium
|
||||||
|
IMPORTING iv_age TYPE i
|
||||||
|
iv_power_kw TYPE i
|
||||||
|
iv_region TYPE ty_region
|
||||||
|
iv_claim_free_years TYPE i
|
||||||
|
RETURNING VALUE(rv_premium) TYPE ty_premium.
|
||||||
|
PRIVATE SECTION.
|
||||||
|
METHODS get_base_premium
|
||||||
|
IMPORTING iv_region TYPE ty_region
|
||||||
|
RETURNING VALUE(rv_base) TYPE ty_premium.
|
||||||
|
METHODS get_age_factor
|
||||||
|
IMPORTING iv_age TYPE i
|
||||||
|
RETURNING VALUE(rv_factor) TYPE decfloat34.
|
||||||
|
METHODS get_power_factor
|
||||||
|
IMPORTING iv_power_kw TYPE i
|
||||||
|
RETURNING VALUE(rv_factor) TYPE decfloat34.
|
||||||
|
METHODS get_discount_factor
|
||||||
|
IMPORTING iv_claim_free_years TYPE i
|
||||||
|
RETURNING VALUE(rv_factor) TYPE decfloat34.
|
||||||
|
ENDCLASS.
|
||||||
|
|
||||||
|
CLASS {{p}}insurance_premium IMPLEMENTATION.
|
||||||
|
METHOD calculate_premium.
|
||||||
|
IF iv_age < 18 OR iv_age > 99
|
||||||
|
AND iv_power_kw <= 0
|
||||||
|
OR iv_claim_free_years < 0.
|
||||||
|
rv_premium = 0.
|
||||||
|
RETURN.
|
||||||
|
ENDIF.
|
||||||
|
DATA(lv_base) = get_base_premium( iv_region ).
|
||||||
|
IF lv_base = 0.
|
||||||
|
rv_premium = 0.
|
||||||
|
RETURN.
|
||||||
|
ENDIF.
|
||||||
|
DATA(lv_premium) = CONV decfloat34( lv_base )
|
||||||
|
* get_age_factor( iv_age )
|
||||||
|
* get_power_factor( iv_power_kw )
|
||||||
|
* get_discount_factor( iv_claim_free_years ).
|
||||||
|
rv_premium = lv_premium.
|
||||||
|
IF rv_premium < 100.
|
||||||
|
rv_premium = 100.
|
||||||
|
ENDIF.
|
||||||
|
ENDMETHOD.
|
||||||
|
|
||||||
|
METHOD get_base_premium.
|
||||||
|
CASE iv_region.
|
||||||
|
WHEN 'A1'.
|
||||||
|
rv_base = 150.
|
||||||
|
WHEN 'B2'.
|
||||||
|
rv_base = 200.
|
||||||
|
WHEN 'C3'.
|
||||||
|
rv_base = 250.
|
||||||
|
WHEN 'D4'.
|
||||||
|
rv_base = 300.
|
||||||
|
WHEN 'E5'.
|
||||||
|
rv_base = 350.
|
||||||
|
WHEN OTHERS.
|
||||||
|
rv_base = 0.
|
||||||
|
ENDCASE.
|
||||||
|
ENDMETHOD.
|
||||||
|
|
||||||
|
METHOD get_age_factor.
|
||||||
|
IF iv_age < 25.
|
||||||
|
rv_factor = '1.5'.
|
||||||
|
ELSEIF iv_age > 65.
|
||||||
|
rv_factor = '1.2'.
|
||||||
|
ELSE.
|
||||||
|
rv_factor = '1.0'.
|
||||||
|
ENDIF.
|
||||||
|
ENDMETHOD.
|
||||||
|
|
||||||
|
METHOD get_power_factor.
|
||||||
|
IF iv_power_kw <= 50.
|
||||||
|
rv_factor = '0.9'.
|
||||||
|
ELSEIF iv_power_kw <= 100.
|
||||||
|
rv_factor = '1.0'.
|
||||||
|
ELSEIF iv_power_kw <= 150.
|
||||||
|
rv_factor = '1.3'.
|
||||||
|
ELSE.
|
||||||
|
rv_factor = '1.6'.
|
||||||
|
ENDIF.
|
||||||
|
ENDMETHOD.
|
||||||
|
|
||||||
|
METHOD get_discount_factor.
|
||||||
|
DATA(lv_discount) = iv_claim_free_years * 5.
|
||||||
|
IF lv_discount > 30.
|
||||||
|
lv_discount = 30.
|
||||||
|
ENDIF.
|
||||||
|
rv_factor = CONV decfloat34( 100 - lv_discount ) / 100.
|
||||||
|
ENDMETHOD.
|
||||||
|
ENDCLASS.
|
||||||
96
tasks_gen/eval/G0104/faulty/m1_insurance_premium.clas.abap
Normal file
96
tasks_gen/eval/G0104/faulty/m1_insurance_premium.clas.abap
Normal file
@@ -0,0 +1,96 @@
|
|||||||
|
CLASS {{p}}insurance_premium DEFINITION PUBLIC FINAL CREATE PUBLIC.
|
||||||
|
PUBLIC SECTION.
|
||||||
|
TYPES:
|
||||||
|
ty_region TYPE c LENGTH 2,
|
||||||
|
ty_premium TYPE p LENGTH 8 DECIMALS 2.
|
||||||
|
METHODS calculate_premium
|
||||||
|
IMPORTING iv_age TYPE i
|
||||||
|
iv_power_kw TYPE i
|
||||||
|
iv_region TYPE ty_region
|
||||||
|
iv_claim_free_years TYPE i
|
||||||
|
RETURNING VALUE(rv_premium) TYPE ty_premium.
|
||||||
|
PRIVATE SECTION.
|
||||||
|
METHODS get_base_premium
|
||||||
|
IMPORTING iv_region TYPE ty_region
|
||||||
|
RETURNING VALUE(rv_base) TYPE ty_premium.
|
||||||
|
METHODS get_age_factor
|
||||||
|
IMPORTING iv_age TYPE i
|
||||||
|
RETURNING VALUE(rv_factor) TYPE decfloat34.
|
||||||
|
METHODS get_power_factor
|
||||||
|
IMPORTING iv_power_kw TYPE i
|
||||||
|
RETURNING VALUE(rv_factor) TYPE decfloat34.
|
||||||
|
METHODS get_discount_factor
|
||||||
|
IMPORTING iv_claim_free_years TYPE i
|
||||||
|
RETURNING VALUE(rv_factor) TYPE decfloat34.
|
||||||
|
ENDCLASS.
|
||||||
|
|
||||||
|
CLASS {{p}}insurance_premium IMPLEMENTATION.
|
||||||
|
METHOD calculate_premium.
|
||||||
|
IF iv_age < 18 OR iv_age > 99
|
||||||
|
OR iv_power_kw <= 0
|
||||||
|
OR iv_claim_free_years >= 0.
|
||||||
|
rv_premium = 0.
|
||||||
|
RETURN.
|
||||||
|
ENDIF.
|
||||||
|
DATA(lv_base) = get_base_premium( iv_region ).
|
||||||
|
IF lv_base = 0.
|
||||||
|
rv_premium = 0.
|
||||||
|
RETURN.
|
||||||
|
ENDIF.
|
||||||
|
DATA(lv_premium) = CONV decfloat34( lv_base )
|
||||||
|
* get_age_factor( iv_age )
|
||||||
|
* get_power_factor( iv_power_kw )
|
||||||
|
* get_discount_factor( iv_claim_free_years ).
|
||||||
|
rv_premium = lv_premium.
|
||||||
|
IF rv_premium < 100.
|
||||||
|
rv_premium = 100.
|
||||||
|
ENDIF.
|
||||||
|
ENDMETHOD.
|
||||||
|
|
||||||
|
METHOD get_base_premium.
|
||||||
|
CASE iv_region.
|
||||||
|
WHEN 'A1'.
|
||||||
|
rv_base = 150.
|
||||||
|
WHEN 'B2'.
|
||||||
|
rv_base = 200.
|
||||||
|
WHEN 'C3'.
|
||||||
|
rv_base = 250.
|
||||||
|
WHEN 'D4'.
|
||||||
|
rv_base = 300.
|
||||||
|
WHEN 'E5'.
|
||||||
|
rv_base = 350.
|
||||||
|
WHEN OTHERS.
|
||||||
|
rv_base = 0.
|
||||||
|
ENDCASE.
|
||||||
|
ENDMETHOD.
|
||||||
|
|
||||||
|
METHOD get_age_factor.
|
||||||
|
IF iv_age < 25.
|
||||||
|
rv_factor = '1.5'.
|
||||||
|
ELSEIF iv_age > 65.
|
||||||
|
rv_factor = '1.2'.
|
||||||
|
ELSE.
|
||||||
|
rv_factor = '1.0'.
|
||||||
|
ENDIF.
|
||||||
|
ENDMETHOD.
|
||||||
|
|
||||||
|
METHOD get_power_factor.
|
||||||
|
IF iv_power_kw <= 50.
|
||||||
|
rv_factor = '0.9'.
|
||||||
|
ELSEIF iv_power_kw <= 100.
|
||||||
|
rv_factor = '1.0'.
|
||||||
|
ELSEIF iv_power_kw <= 150.
|
||||||
|
rv_factor = '1.3'.
|
||||||
|
ELSE.
|
||||||
|
rv_factor = '1.6'.
|
||||||
|
ENDIF.
|
||||||
|
ENDMETHOD.
|
||||||
|
|
||||||
|
METHOD get_discount_factor.
|
||||||
|
DATA(lv_discount) = iv_claim_free_years * 5.
|
||||||
|
IF lv_discount > 30.
|
||||||
|
lv_discount = 30.
|
||||||
|
ENDIF.
|
||||||
|
rv_factor = CONV decfloat34( 100 - lv_discount ) / 100.
|
||||||
|
ENDMETHOD.
|
||||||
|
ENDCLASS.
|
||||||
96
tasks_gen/eval/G0104/faulty/m2_insurance_premium.clas.abap
Normal file
96
tasks_gen/eval/G0104/faulty/m2_insurance_premium.clas.abap
Normal file
@@ -0,0 +1,96 @@
|
|||||||
|
CLASS {{p}}insurance_premium DEFINITION PUBLIC FINAL CREATE PUBLIC.
|
||||||
|
PUBLIC SECTION.
|
||||||
|
TYPES:
|
||||||
|
ty_region TYPE c LENGTH 2,
|
||||||
|
ty_premium TYPE p LENGTH 8 DECIMALS 2.
|
||||||
|
METHODS calculate_premium
|
||||||
|
IMPORTING iv_age TYPE i
|
||||||
|
iv_power_kw TYPE i
|
||||||
|
iv_region TYPE ty_region
|
||||||
|
iv_claim_free_years TYPE i
|
||||||
|
RETURNING VALUE(rv_premium) TYPE ty_premium.
|
||||||
|
PRIVATE SECTION.
|
||||||
|
METHODS get_base_premium
|
||||||
|
IMPORTING iv_region TYPE ty_region
|
||||||
|
RETURNING VALUE(rv_base) TYPE ty_premium.
|
||||||
|
METHODS get_age_factor
|
||||||
|
IMPORTING iv_age TYPE i
|
||||||
|
RETURNING VALUE(rv_factor) TYPE decfloat34.
|
||||||
|
METHODS get_power_factor
|
||||||
|
IMPORTING iv_power_kw TYPE i
|
||||||
|
RETURNING VALUE(rv_factor) TYPE decfloat34.
|
||||||
|
METHODS get_discount_factor
|
||||||
|
IMPORTING iv_claim_free_years TYPE i
|
||||||
|
RETURNING VALUE(rv_factor) TYPE decfloat34.
|
||||||
|
ENDCLASS.
|
||||||
|
|
||||||
|
CLASS {{p}}insurance_premium IMPLEMENTATION.
|
||||||
|
METHOD calculate_premium.
|
||||||
|
IF iv_age < 18 OR iv_age > 99
|
||||||
|
OR iv_power_kw <= 0
|
||||||
|
OR iv_claim_free_years < 0.
|
||||||
|
rv_premium = 0.
|
||||||
|
RETURN.
|
||||||
|
ENDIF.
|
||||||
|
DATA(lv_base) = get_base_premium( iv_region ).
|
||||||
|
IF lv_base <> 0.
|
||||||
|
rv_premium = 0.
|
||||||
|
RETURN.
|
||||||
|
ENDIF.
|
||||||
|
DATA(lv_premium) = CONV decfloat34( lv_base )
|
||||||
|
* get_age_factor( iv_age )
|
||||||
|
* get_power_factor( iv_power_kw )
|
||||||
|
* get_discount_factor( iv_claim_free_years ).
|
||||||
|
rv_premium = lv_premium.
|
||||||
|
IF rv_premium < 100.
|
||||||
|
rv_premium = 100.
|
||||||
|
ENDIF.
|
||||||
|
ENDMETHOD.
|
||||||
|
|
||||||
|
METHOD get_base_premium.
|
||||||
|
CASE iv_region.
|
||||||
|
WHEN 'A1'.
|
||||||
|
rv_base = 150.
|
||||||
|
WHEN 'B2'.
|
||||||
|
rv_base = 200.
|
||||||
|
WHEN 'C3'.
|
||||||
|
rv_base = 250.
|
||||||
|
WHEN 'D4'.
|
||||||
|
rv_base = 300.
|
||||||
|
WHEN 'E5'.
|
||||||
|
rv_base = 350.
|
||||||
|
WHEN OTHERS.
|
||||||
|
rv_base = 0.
|
||||||
|
ENDCASE.
|
||||||
|
ENDMETHOD.
|
||||||
|
|
||||||
|
METHOD get_age_factor.
|
||||||
|
IF iv_age < 25.
|
||||||
|
rv_factor = '1.5'.
|
||||||
|
ELSEIF iv_age > 65.
|
||||||
|
rv_factor = '1.2'.
|
||||||
|
ELSE.
|
||||||
|
rv_factor = '1.0'.
|
||||||
|
ENDIF.
|
||||||
|
ENDMETHOD.
|
||||||
|
|
||||||
|
METHOD get_power_factor.
|
||||||
|
IF iv_power_kw <= 50.
|
||||||
|
rv_factor = '0.9'.
|
||||||
|
ELSEIF iv_power_kw <= 100.
|
||||||
|
rv_factor = '1.0'.
|
||||||
|
ELSEIF iv_power_kw <= 150.
|
||||||
|
rv_factor = '1.3'.
|
||||||
|
ELSE.
|
||||||
|
rv_factor = '1.6'.
|
||||||
|
ENDIF.
|
||||||
|
ENDMETHOD.
|
||||||
|
|
||||||
|
METHOD get_discount_factor.
|
||||||
|
DATA(lv_discount) = iv_claim_free_years * 5.
|
||||||
|
IF lv_discount > 30.
|
||||||
|
lv_discount = 30.
|
||||||
|
ENDIF.
|
||||||
|
rv_factor = CONV decfloat34( 100 - lv_discount ) / 100.
|
||||||
|
ENDMETHOD.
|
||||||
|
ENDCLASS.
|
||||||
96
tasks_gen/eval/G0104/faulty/m3_insurance_premium.clas.abap
Normal file
96
tasks_gen/eval/G0104/faulty/m3_insurance_premium.clas.abap
Normal file
@@ -0,0 +1,96 @@
|
|||||||
|
CLASS {{p}}insurance_premium DEFINITION PUBLIC FINAL CREATE PUBLIC.
|
||||||
|
PUBLIC SECTION.
|
||||||
|
TYPES:
|
||||||
|
ty_region TYPE c LENGTH 2,
|
||||||
|
ty_premium TYPE p LENGTH 8 DECIMALS 2.
|
||||||
|
METHODS calculate_premium
|
||||||
|
IMPORTING iv_age TYPE i
|
||||||
|
iv_power_kw TYPE i
|
||||||
|
iv_region TYPE ty_region
|
||||||
|
iv_claim_free_years TYPE i
|
||||||
|
RETURNING VALUE(rv_premium) TYPE ty_premium.
|
||||||
|
PRIVATE SECTION.
|
||||||
|
METHODS get_base_premium
|
||||||
|
IMPORTING iv_region TYPE ty_region
|
||||||
|
RETURNING VALUE(rv_base) TYPE ty_premium.
|
||||||
|
METHODS get_age_factor
|
||||||
|
IMPORTING iv_age TYPE i
|
||||||
|
RETURNING VALUE(rv_factor) TYPE decfloat34.
|
||||||
|
METHODS get_power_factor
|
||||||
|
IMPORTING iv_power_kw TYPE i
|
||||||
|
RETURNING VALUE(rv_factor) TYPE decfloat34.
|
||||||
|
METHODS get_discount_factor
|
||||||
|
IMPORTING iv_claim_free_years TYPE i
|
||||||
|
RETURNING VALUE(rv_factor) TYPE decfloat34.
|
||||||
|
ENDCLASS.
|
||||||
|
|
||||||
|
CLASS {{p}}insurance_premium IMPLEMENTATION.
|
||||||
|
METHOD calculate_premium.
|
||||||
|
IF iv_age < 18 OR iv_age > 99
|
||||||
|
OR iv_power_kw <= 0
|
||||||
|
OR iv_claim_free_years < 0.
|
||||||
|
rv_premium = 0.
|
||||||
|
RETURN.
|
||||||
|
ENDIF.
|
||||||
|
DATA(lv_base) = get_base_premium( iv_region ).
|
||||||
|
IF lv_base = 0.
|
||||||
|
rv_premium = 0.
|
||||||
|
RETURN.
|
||||||
|
ENDIF.
|
||||||
|
DATA(lv_premium) = CONV decfloat34( lv_base )
|
||||||
|
/ get_age_factor( iv_age )
|
||||||
|
* get_power_factor( iv_power_kw )
|
||||||
|
* get_discount_factor( iv_claim_free_years ).
|
||||||
|
rv_premium = lv_premium.
|
||||||
|
IF rv_premium < 100.
|
||||||
|
rv_premium = 100.
|
||||||
|
ENDIF.
|
||||||
|
ENDMETHOD.
|
||||||
|
|
||||||
|
METHOD get_base_premium.
|
||||||
|
CASE iv_region.
|
||||||
|
WHEN 'A1'.
|
||||||
|
rv_base = 150.
|
||||||
|
WHEN 'B2'.
|
||||||
|
rv_base = 200.
|
||||||
|
WHEN 'C3'.
|
||||||
|
rv_base = 250.
|
||||||
|
WHEN 'D4'.
|
||||||
|
rv_base = 300.
|
||||||
|
WHEN 'E5'.
|
||||||
|
rv_base = 350.
|
||||||
|
WHEN OTHERS.
|
||||||
|
rv_base = 0.
|
||||||
|
ENDCASE.
|
||||||
|
ENDMETHOD.
|
||||||
|
|
||||||
|
METHOD get_age_factor.
|
||||||
|
IF iv_age < 25.
|
||||||
|
rv_factor = '1.5'.
|
||||||
|
ELSEIF iv_age > 65.
|
||||||
|
rv_factor = '1.2'.
|
||||||
|
ELSE.
|
||||||
|
rv_factor = '1.0'.
|
||||||
|
ENDIF.
|
||||||
|
ENDMETHOD.
|
||||||
|
|
||||||
|
METHOD get_power_factor.
|
||||||
|
IF iv_power_kw <= 50.
|
||||||
|
rv_factor = '0.9'.
|
||||||
|
ELSEIF iv_power_kw <= 100.
|
||||||
|
rv_factor = '1.0'.
|
||||||
|
ELSEIF iv_power_kw <= 150.
|
||||||
|
rv_factor = '1.3'.
|
||||||
|
ELSE.
|
||||||
|
rv_factor = '1.6'.
|
||||||
|
ENDIF.
|
||||||
|
ENDMETHOD.
|
||||||
|
|
||||||
|
METHOD get_discount_factor.
|
||||||
|
DATA(lv_discount) = iv_claim_free_years * 5.
|
||||||
|
IF lv_discount > 30.
|
||||||
|
lv_discount = 30.
|
||||||
|
ENDIF.
|
||||||
|
rv_factor = CONV decfloat34( 100 - lv_discount ) / 100.
|
||||||
|
ENDMETHOD.
|
||||||
|
ENDCLASS.
|
||||||
96
tasks_gen/eval/G0104/faulty/m4_insurance_premium.clas.abap
Normal file
96
tasks_gen/eval/G0104/faulty/m4_insurance_premium.clas.abap
Normal file
@@ -0,0 +1,96 @@
|
|||||||
|
CLASS {{p}}insurance_premium DEFINITION PUBLIC FINAL CREATE PUBLIC.
|
||||||
|
PUBLIC SECTION.
|
||||||
|
TYPES:
|
||||||
|
ty_region TYPE c LENGTH 2,
|
||||||
|
ty_premium TYPE p LENGTH 8 DECIMALS 2.
|
||||||
|
METHODS calculate_premium
|
||||||
|
IMPORTING iv_age TYPE i
|
||||||
|
iv_power_kw TYPE i
|
||||||
|
iv_region TYPE ty_region
|
||||||
|
iv_claim_free_years TYPE i
|
||||||
|
RETURNING VALUE(rv_premium) TYPE ty_premium.
|
||||||
|
PRIVATE SECTION.
|
||||||
|
METHODS get_base_premium
|
||||||
|
IMPORTING iv_region TYPE ty_region
|
||||||
|
RETURNING VALUE(rv_base) TYPE ty_premium.
|
||||||
|
METHODS get_age_factor
|
||||||
|
IMPORTING iv_age TYPE i
|
||||||
|
RETURNING VALUE(rv_factor) TYPE decfloat34.
|
||||||
|
METHODS get_power_factor
|
||||||
|
IMPORTING iv_power_kw TYPE i
|
||||||
|
RETURNING VALUE(rv_factor) TYPE decfloat34.
|
||||||
|
METHODS get_discount_factor
|
||||||
|
IMPORTING iv_claim_free_years TYPE i
|
||||||
|
RETURNING VALUE(rv_factor) TYPE decfloat34.
|
||||||
|
ENDCLASS.
|
||||||
|
|
||||||
|
CLASS {{p}}insurance_premium IMPLEMENTATION.
|
||||||
|
METHOD calculate_premium.
|
||||||
|
IF iv_age < 18 OR iv_age > 99
|
||||||
|
OR iv_power_kw <= 0
|
||||||
|
OR iv_claim_free_years < 0.
|
||||||
|
rv_premium = 0.
|
||||||
|
RETURN.
|
||||||
|
ENDIF.
|
||||||
|
DATA(lv_base) = get_base_premium( iv_region ).
|
||||||
|
IF lv_base = 0.
|
||||||
|
rv_premium = 0.
|
||||||
|
RETURN.
|
||||||
|
ENDIF.
|
||||||
|
DATA(lv_premium) = CONV decfloat34( lv_base )
|
||||||
|
* get_age_factor( iv_age )
|
||||||
|
* get_power_factor( iv_power_kw )
|
||||||
|
* get_discount_factor( iv_claim_free_years ).
|
||||||
|
rv_premium = lv_premium.
|
||||||
|
IF rv_premium < 100.
|
||||||
|
rv_premium = 100.
|
||||||
|
ENDIF.
|
||||||
|
ENDMETHOD.
|
||||||
|
|
||||||
|
METHOD get_base_premium.
|
||||||
|
CASE iv_region.
|
||||||
|
WHEN 'A1'.
|
||||||
|
rv_base = 150.
|
||||||
|
WHEN 'B2'.
|
||||||
|
rv_base = 200.
|
||||||
|
WHEN 'C3'.
|
||||||
|
rv_base = 250.
|
||||||
|
WHEN 'D4'.
|
||||||
|
rv_base = 300.
|
||||||
|
WHEN 'E5'.
|
||||||
|
rv_base = 350.
|
||||||
|
WHEN OTHERS.
|
||||||
|
rv_base = 0.
|
||||||
|
ENDCASE.
|
||||||
|
ENDMETHOD.
|
||||||
|
|
||||||
|
METHOD get_age_factor.
|
||||||
|
IF iv_age < 25.
|
||||||
|
rv_factor = '1.5'.
|
||||||
|
ELSEIF iv_age > 65.
|
||||||
|
rv_factor = '1.2'.
|
||||||
|
ELSE.
|
||||||
|
rv_factor = '1.0'.
|
||||||
|
ENDIF.
|
||||||
|
ENDMETHOD.
|
||||||
|
|
||||||
|
METHOD get_power_factor.
|
||||||
|
IF iv_power_kw <= 50.
|
||||||
|
rv_factor = '0.9'.
|
||||||
|
ELSEIF iv_power_kw <= 100.
|
||||||
|
rv_factor = '1.0'.
|
||||||
|
ELSEIF iv_power_kw <= 150.
|
||||||
|
rv_factor = '1.3'.
|
||||||
|
ELSE.
|
||||||
|
rv_factor = '1.6'.
|
||||||
|
ENDIF.
|
||||||
|
ENDMETHOD.
|
||||||
|
|
||||||
|
METHOD get_discount_factor.
|
||||||
|
DATA(lv_discount) = iv_claim_free_years * 5.
|
||||||
|
IF lv_discount > 30.
|
||||||
|
lv_discount = 30.
|
||||||
|
ENDIF.
|
||||||
|
rv_factor = CONV decfloat34( 101 - lv_discount ) / 100.
|
||||||
|
ENDMETHOD.
|
||||||
|
ENDCLASS.
|
||||||
24
tasks_gen/eval/G0104/generation.json
Normal file
24
tasks_gen/eval/G0104/generation.json
Normal file
@@ -0,0 +1,24 @@
|
|||||||
|
{
|
||||||
|
"id": "G0104",
|
||||||
|
"pool": "eval",
|
||||||
|
"object_type": "CLAS",
|
||||||
|
"category": "A",
|
||||||
|
"attempts": [
|
||||||
|
{
|
||||||
|
"stage": "validate",
|
||||||
|
"oracle": 91.0,
|
||||||
|
"null": 0
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"stage": "validate",
|
||||||
|
"oracle": 100.0,
|
||||||
|
"null": 0,
|
||||||
|
"mutation": {
|
||||||
|
"valid": 5,
|
||||||
|
"killed": 5,
|
||||||
|
"ok": true
|
||||||
|
}
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"accepted": true
|
||||||
|
}
|
||||||
111
tasks_gen/eval/G0104/hidden/t02_hidden.clas.abap
Normal file
111
tasks_gen/eval/G0104/hidden/t02_hidden.clas.abap
Normal file
@@ -0,0 +1,111 @@
|
|||||||
|
CLASS {{p}}t02_hidden DEFINITION PUBLIC FINAL CREATE PUBLIC
|
||||||
|
FOR TESTING DURATION SHORT RISK LEVEL HARMLESS.
|
||||||
|
PRIVATE SECTION.
|
||||||
|
DATA mo_cut TYPE REF TO {{p}}insurance_premium.
|
||||||
|
METHODS setup.
|
||||||
|
METHODS standard_premium FOR TESTING.
|
||||||
|
METHODS young_driver FOR TESTING.
|
||||||
|
METHODS senior_driver FOR TESTING.
|
||||||
|
METHODS high_power FOR TESTING.
|
||||||
|
METHODS very_high_power FOR TESTING.
|
||||||
|
METHODS low_power FOR TESTING.
|
||||||
|
METHODS claim_free_discount FOR TESTING.
|
||||||
|
METHODS claim_free_capped FOR TESTING.
|
||||||
|
METHODS minimum_premium FOR TESTING.
|
||||||
|
METHODS all_regions FOR TESTING.
|
||||||
|
METHODS invalid_region FOR TESTING.
|
||||||
|
METHODS invalid_inputs FOR TESTING.
|
||||||
|
ENDCLASS.
|
||||||
|
|
||||||
|
CLASS {{p}}t02_hidden IMPLEMENTATION.
|
||||||
|
METHOD setup.
|
||||||
|
mo_cut = NEW {{p}}insurance_premium( ).
|
||||||
|
ENDMETHOD.
|
||||||
|
|
||||||
|
METHOD standard_premium.
|
||||||
|
cl_abap_unit_assert=>assert_equals(
|
||||||
|
exp = 150
|
||||||
|
act = mo_cut->calculate_premium( iv_age = 30 iv_power_kw = 80 iv_region = 'A1' iv_claim_free_years = 0 ) ).
|
||||||
|
ENDMETHOD.
|
||||||
|
|
||||||
|
METHOD young_driver.
|
||||||
|
cl_abap_unit_assert=>assert_equals(
|
||||||
|
exp = 225
|
||||||
|
act = mo_cut->calculate_premium( iv_age = 22 iv_power_kw = 80 iv_region = 'A1' iv_claim_free_years = 0 ) ).
|
||||||
|
ENDMETHOD.
|
||||||
|
|
||||||
|
METHOD senior_driver.
|
||||||
|
cl_abap_unit_assert=>assert_equals(
|
||||||
|
exp = 180
|
||||||
|
act = mo_cut->calculate_premium( iv_age = 70 iv_power_kw = 80 iv_region = 'A1' iv_claim_free_years = 0 ) ).
|
||||||
|
ENDMETHOD.
|
||||||
|
|
||||||
|
METHOD high_power.
|
||||||
|
cl_abap_unit_assert=>assert_equals(
|
||||||
|
exp = 195
|
||||||
|
act = mo_cut->calculate_premium( iv_age = 30 iv_power_kw = 120 iv_region = 'A1' iv_claim_free_years = 0 ) ).
|
||||||
|
ENDMETHOD.
|
||||||
|
|
||||||
|
METHOD very_high_power.
|
||||||
|
cl_abap_unit_assert=>assert_equals(
|
||||||
|
exp = 240
|
||||||
|
act = mo_cut->calculate_premium( iv_age = 30 iv_power_kw = 200 iv_region = 'A1' iv_claim_free_years = 0 ) ).
|
||||||
|
ENDMETHOD.
|
||||||
|
|
||||||
|
METHOD low_power.
|
||||||
|
cl_abap_unit_assert=>assert_equals(
|
||||||
|
exp = 135
|
||||||
|
act = mo_cut->calculate_premium( iv_age = 30 iv_power_kw = 40 iv_region = 'A1' iv_claim_free_years = 0 ) ).
|
||||||
|
ENDMETHOD.
|
||||||
|
|
||||||
|
METHOD claim_free_discount.
|
||||||
|
cl_abap_unit_assert=>assert_equals(
|
||||||
|
exp = 180
|
||||||
|
act = mo_cut->calculate_premium( iv_age = 30 iv_power_kw = 80 iv_region = 'B2' iv_claim_free_years = 2 ) ).
|
||||||
|
ENDMETHOD.
|
||||||
|
|
||||||
|
METHOD claim_free_capped.
|
||||||
|
cl_abap_unit_assert=>assert_equals(
|
||||||
|
exp = 140
|
||||||
|
act = mo_cut->calculate_premium( iv_age = 30 iv_power_kw = 80 iv_region = 'B2' iv_claim_free_years = 10 ) ).
|
||||||
|
ENDMETHOD.
|
||||||
|
|
||||||
|
METHOD minimum_premium.
|
||||||
|
cl_abap_unit_assert=>assert_equals(
|
||||||
|
exp = 100
|
||||||
|
act = mo_cut->calculate_premium( iv_age = 25 iv_power_kw = 50 iv_region = 'A1' iv_claim_free_years = 6 ) ).
|
||||||
|
ENDMETHOD.
|
||||||
|
|
||||||
|
METHOD all_regions.
|
||||||
|
cl_abap_unit_assert=>assert_equals(
|
||||||
|
exp = 250 msg = 'C3'
|
||||||
|
act = mo_cut->calculate_premium( iv_age = 30 iv_power_kw = 80 iv_region = 'C3' iv_claim_free_years = 0 ) ).
|
||||||
|
cl_abap_unit_assert=>assert_equals(
|
||||||
|
exp = 300 msg = 'D4'
|
||||||
|
act = mo_cut->calculate_premium( iv_age = 30 iv_power_kw = 80 iv_region = 'D4' iv_claim_free_years = 0 ) ).
|
||||||
|
cl_abap_unit_assert=>assert_equals(
|
||||||
|
exp = 350 msg = 'E5'
|
||||||
|
act = mo_cut->calculate_premium( iv_age = 30 iv_power_kw = 80 iv_region = 'E5' iv_claim_free_years = 0 ) ).
|
||||||
|
ENDMETHOD.
|
||||||
|
|
||||||
|
METHOD invalid_region.
|
||||||
|
cl_abap_unit_assert=>assert_equals(
|
||||||
|
exp = 0
|
||||||
|
act = mo_cut->calculate_premium( iv_age = 30 iv_power_kw = 80 iv_region = 'X9' iv_claim_free_years = 0 ) ).
|
||||||
|
ENDMETHOD.
|
||||||
|
|
||||||
|
METHOD invalid_inputs.
|
||||||
|
cl_abap_unit_assert=>assert_equals(
|
||||||
|
exp = 0 msg = 'age too low'
|
||||||
|
act = mo_cut->calculate_premium( iv_age = 17 iv_power_kw = 80 iv_region = 'A1' iv_claim_free_years = 0 ) ).
|
||||||
|
cl_abap_unit_assert=>assert_equals(
|
||||||
|
exp = 0 msg = 'age too high'
|
||||||
|
act = mo_cut->calculate_premium( iv_age = 100 iv_power_kw = 80 iv_region = 'A1' iv_claim_free_years = 0 ) ).
|
||||||
|
cl_abap_unit_assert=>assert_equals(
|
||||||
|
exp = 0 msg = 'power too low'
|
||||||
|
act = mo_cut->calculate_premium( iv_age = 30 iv_power_kw = 0 iv_region = 'A1' iv_claim_free_years = 0 ) ).
|
||||||
|
cl_abap_unit_assert=>assert_equals(
|
||||||
|
exp = 0 msg = 'negative claim free years'
|
||||||
|
act = mo_cut->calculate_premium( iv_age = 30 iv_power_kw = 80 iv_region = 'A1' iv_claim_free_years = -1 ) ).
|
||||||
|
ENDMETHOD.
|
||||||
|
ENDCLASS.
|
||||||
83
tasks_gen/eval/G0104/mutation.json
Normal file
83
tasks_gen/eval/G0104/mutation.json
Normal file
@@ -0,0 +1,83 @@
|
|||||||
|
{
|
||||||
|
"task": "G0104",
|
||||||
|
"mutants": [
|
||||||
|
{
|
||||||
|
"object": "{{P}}INSURANCE_PREMIUM",
|
||||||
|
"mutant": "line 30: OR -> AND (logic)",
|
||||||
|
"status": "killed",
|
||||||
|
"hidden": "11/12",
|
||||||
|
"failed_tests": [
|
||||||
|
"INVALID_INPUTS"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"object": "{{P}}INSURANCE_PREMIUM",
|
||||||
|
"mutant": "line 31: < -> >= (rel)",
|
||||||
|
"status": "killed",
|
||||||
|
"hidden": "1/12",
|
||||||
|
"failed_tests": [
|
||||||
|
"ALL_REGIONS",
|
||||||
|
"CLAIM_FREE_CAPPED",
|
||||||
|
"CLAIM_FREE_DISCOUNT",
|
||||||
|
"HIGH_POWER",
|
||||||
|
"INVALID_INPUTS",
|
||||||
|
"LOW_POWER",
|
||||||
|
"MINIMUM_PREMIUM",
|
||||||
|
"SENIOR_DRIVER",
|
||||||
|
"STANDARD_PREMIUM",
|
||||||
|
"VERY_HIGH_POWER",
|
||||||
|
"YOUNG_DRIVER"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"object": "{{P}}INSURANCE_PREMIUM",
|
||||||
|
"mutant": "line 36: = -> <> (eq)",
|
||||||
|
"status": "killed",
|
||||||
|
"hidden": "1/12",
|
||||||
|
"failed_tests": [
|
||||||
|
"ALL_REGIONS",
|
||||||
|
"CLAIM_FREE_CAPPED",
|
||||||
|
"CLAIM_FREE_DISCOUNT",
|
||||||
|
"HIGH_POWER",
|
||||||
|
"INVALID_REGION",
|
||||||
|
"LOW_POWER",
|
||||||
|
"MINIMUM_PREMIUM",
|
||||||
|
"SENIOR_DRIVER",
|
||||||
|
"STANDARD_PREMIUM",
|
||||||
|
"VERY_HIGH_POWER",
|
||||||
|
"YOUNG_DRIVER"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"object": "{{P}}INSURANCE_PREMIUM",
|
||||||
|
"mutant": "line 41: * -> / (arith)",
|
||||||
|
"status": "killed",
|
||||||
|
"hidden": "10/12",
|
||||||
|
"failed_tests": [
|
||||||
|
"SENIOR_DRIVER",
|
||||||
|
"YOUNG_DRIVER"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"object": "{{P}}INSURANCE_PREMIUM",
|
||||||
|
"mutant": "line 94: 100 -> 101 (const)",
|
||||||
|
"status": "killed",
|
||||||
|
"hidden": "3/12",
|
||||||
|
"failed_tests": [
|
||||||
|
"ALL_REGIONS",
|
||||||
|
"CLAIM_FREE_CAPPED",
|
||||||
|
"CLAIM_FREE_DISCOUNT",
|
||||||
|
"HIGH_POWER",
|
||||||
|
"LOW_POWER",
|
||||||
|
"SENIOR_DRIVER",
|
||||||
|
"STANDARD_PREMIUM",
|
||||||
|
"VERY_HIGH_POWER",
|
||||||
|
"YOUNG_DRIVER"
|
||||||
|
]
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"valid": 5,
|
||||||
|
"killed": 5,
|
||||||
|
"kill_rate": 1.0,
|
||||||
|
"ok": true
|
||||||
|
}
|
||||||
96
tasks_gen/eval/G0104/reference/insurance_premium.clas.abap
Normal file
96
tasks_gen/eval/G0104/reference/insurance_premium.clas.abap
Normal file
@@ -0,0 +1,96 @@
|
|||||||
|
CLASS {{p}}insurance_premium DEFINITION PUBLIC FINAL CREATE PUBLIC.
|
||||||
|
PUBLIC SECTION.
|
||||||
|
TYPES:
|
||||||
|
ty_region TYPE c LENGTH 2,
|
||||||
|
ty_premium TYPE p LENGTH 8 DECIMALS 2.
|
||||||
|
METHODS calculate_premium
|
||||||
|
IMPORTING iv_age TYPE i
|
||||||
|
iv_power_kw TYPE i
|
||||||
|
iv_region TYPE ty_region
|
||||||
|
iv_claim_free_years TYPE i
|
||||||
|
RETURNING VALUE(rv_premium) TYPE ty_premium.
|
||||||
|
PRIVATE SECTION.
|
||||||
|
METHODS get_base_premium
|
||||||
|
IMPORTING iv_region TYPE ty_region
|
||||||
|
RETURNING VALUE(rv_base) TYPE ty_premium.
|
||||||
|
METHODS get_age_factor
|
||||||
|
IMPORTING iv_age TYPE i
|
||||||
|
RETURNING VALUE(rv_factor) TYPE decfloat34.
|
||||||
|
METHODS get_power_factor
|
||||||
|
IMPORTING iv_power_kw TYPE i
|
||||||
|
RETURNING VALUE(rv_factor) TYPE decfloat34.
|
||||||
|
METHODS get_discount_factor
|
||||||
|
IMPORTING iv_claim_free_years TYPE i
|
||||||
|
RETURNING VALUE(rv_factor) TYPE decfloat34.
|
||||||
|
ENDCLASS.
|
||||||
|
|
||||||
|
CLASS {{p}}insurance_premium IMPLEMENTATION.
|
||||||
|
METHOD calculate_premium.
|
||||||
|
IF iv_age < 18 OR iv_age > 99
|
||||||
|
OR iv_power_kw <= 0
|
||||||
|
OR iv_claim_free_years < 0.
|
||||||
|
rv_premium = 0.
|
||||||
|
RETURN.
|
||||||
|
ENDIF.
|
||||||
|
DATA(lv_base) = get_base_premium( iv_region ).
|
||||||
|
IF lv_base = 0.
|
||||||
|
rv_premium = 0.
|
||||||
|
RETURN.
|
||||||
|
ENDIF.
|
||||||
|
DATA(lv_premium) = CONV decfloat34( lv_base )
|
||||||
|
* get_age_factor( iv_age )
|
||||||
|
* get_power_factor( iv_power_kw )
|
||||||
|
* get_discount_factor( iv_claim_free_years ).
|
||||||
|
rv_premium = lv_premium.
|
||||||
|
IF rv_premium < 100.
|
||||||
|
rv_premium = 100.
|
||||||
|
ENDIF.
|
||||||
|
ENDMETHOD.
|
||||||
|
|
||||||
|
METHOD get_base_premium.
|
||||||
|
CASE iv_region.
|
||||||
|
WHEN 'A1'.
|
||||||
|
rv_base = 150.
|
||||||
|
WHEN 'B2'.
|
||||||
|
rv_base = 200.
|
||||||
|
WHEN 'C3'.
|
||||||
|
rv_base = 250.
|
||||||
|
WHEN 'D4'.
|
||||||
|
rv_base = 300.
|
||||||
|
WHEN 'E5'.
|
||||||
|
rv_base = 350.
|
||||||
|
WHEN OTHERS.
|
||||||
|
rv_base = 0.
|
||||||
|
ENDCASE.
|
||||||
|
ENDMETHOD.
|
||||||
|
|
||||||
|
METHOD get_age_factor.
|
||||||
|
IF iv_age < 25.
|
||||||
|
rv_factor = '1.5'.
|
||||||
|
ELSEIF iv_age > 65.
|
||||||
|
rv_factor = '1.2'.
|
||||||
|
ELSE.
|
||||||
|
rv_factor = '1.0'.
|
||||||
|
ENDIF.
|
||||||
|
ENDMETHOD.
|
||||||
|
|
||||||
|
METHOD get_power_factor.
|
||||||
|
IF iv_power_kw <= 50.
|
||||||
|
rv_factor = '0.9'.
|
||||||
|
ELSEIF iv_power_kw <= 100.
|
||||||
|
rv_factor = '1.0'.
|
||||||
|
ELSEIF iv_power_kw <= 150.
|
||||||
|
rv_factor = '1.3'.
|
||||||
|
ELSE.
|
||||||
|
rv_factor = '1.6'.
|
||||||
|
ENDIF.
|
||||||
|
ENDMETHOD.
|
||||||
|
|
||||||
|
METHOD get_discount_factor.
|
||||||
|
DATA(lv_discount) = iv_claim_free_years * 5.
|
||||||
|
IF lv_discount > 30.
|
||||||
|
lv_discount = 30.
|
||||||
|
ENDIF.
|
||||||
|
rv_factor = CONV decfloat34( 100 - lv_discount ) / 100.
|
||||||
|
ENDMETHOD.
|
||||||
|
ENDCLASS.
|
||||||
@@ -0,0 +1,110 @@
|
|||||||
|
CLASS ltc_insurance_premium DEFINITION FINAL FOR TESTING DURATION SHORT RISK LEVEL HARMLESS.
|
||||||
|
PRIVATE SECTION.
|
||||||
|
DATA mo_cut TYPE REF TO {{p}}insurance_premium.
|
||||||
|
METHODS setup.
|
||||||
|
METHODS standard_premium FOR TESTING.
|
||||||
|
METHODS young_driver FOR TESTING.
|
||||||
|
METHODS senior_driver FOR TESTING.
|
||||||
|
METHODS high_power FOR TESTING.
|
||||||
|
METHODS very_high_power FOR TESTING.
|
||||||
|
METHODS low_power FOR TESTING.
|
||||||
|
METHODS claim_free_discount FOR TESTING.
|
||||||
|
METHODS claim_free_capped FOR TESTING.
|
||||||
|
METHODS minimum_premium FOR TESTING.
|
||||||
|
METHODS all_regions FOR TESTING.
|
||||||
|
METHODS invalid_region FOR TESTING.
|
||||||
|
METHODS invalid_inputs FOR TESTING.
|
||||||
|
ENDCLASS.
|
||||||
|
|
||||||
|
CLASS ltc_insurance_premium IMPLEMENTATION.
|
||||||
|
METHOD setup.
|
||||||
|
mo_cut = NEW {{p}}insurance_premium( ).
|
||||||
|
ENDMETHOD.
|
||||||
|
|
||||||
|
METHOD standard_premium.
|
||||||
|
cl_abap_unit_assert=>assert_equals(
|
||||||
|
exp = 150
|
||||||
|
act = mo_cut->calculate_premium( iv_age = 30 iv_power_kw = 80 iv_region = 'A1' iv_claim_free_years = 0 ) ).
|
||||||
|
ENDMETHOD.
|
||||||
|
|
||||||
|
METHOD young_driver.
|
||||||
|
cl_abap_unit_assert=>assert_equals(
|
||||||
|
exp = 225
|
||||||
|
act = mo_cut->calculate_premium( iv_age = 22 iv_power_kw = 80 iv_region = 'A1' iv_claim_free_years = 0 ) ).
|
||||||
|
ENDMETHOD.
|
||||||
|
|
||||||
|
METHOD senior_driver.
|
||||||
|
cl_abap_unit_assert=>assert_equals(
|
||||||
|
exp = 180
|
||||||
|
act = mo_cut->calculate_premium( iv_age = 70 iv_power_kw = 80 iv_region = 'A1' iv_claim_free_years = 0 ) ).
|
||||||
|
ENDMETHOD.
|
||||||
|
|
||||||
|
METHOD high_power.
|
||||||
|
cl_abap_unit_assert=>assert_equals(
|
||||||
|
exp = 195
|
||||||
|
act = mo_cut->calculate_premium( iv_age = 30 iv_power_kw = 120 iv_region = 'A1' iv_claim_free_years = 0 ) ).
|
||||||
|
ENDMETHOD.
|
||||||
|
|
||||||
|
METHOD very_high_power.
|
||||||
|
cl_abap_unit_assert=>assert_equals(
|
||||||
|
exp = 240
|
||||||
|
act = mo_cut->calculate_premium( iv_age = 30 iv_power_kw = 200 iv_region = 'A1' iv_claim_free_years = 0 ) ).
|
||||||
|
ENDMETHOD.
|
||||||
|
|
||||||
|
METHOD low_power.
|
||||||
|
cl_abap_unit_assert=>assert_equals(
|
||||||
|
exp = 135
|
||||||
|
act = mo_cut->calculate_premium( iv_age = 30 iv_power_kw = 40 iv_region = 'A1' iv_claim_free_years = 0 ) ).
|
||||||
|
ENDMETHOD.
|
||||||
|
|
||||||
|
METHOD claim_free_discount.
|
||||||
|
cl_abap_unit_assert=>assert_equals(
|
||||||
|
exp = 180
|
||||||
|
act = mo_cut->calculate_premium( iv_age = 30 iv_power_kw = 80 iv_region = 'B2' iv_claim_free_years = 2 ) ).
|
||||||
|
ENDMETHOD.
|
||||||
|
|
||||||
|
METHOD claim_free_capped.
|
||||||
|
cl_abap_unit_assert=>assert_equals(
|
||||||
|
exp = 140
|
||||||
|
act = mo_cut->calculate_premium( iv_age = 30 iv_power_kw = 80 iv_region = 'B2' iv_claim_free_years = 10 ) ).
|
||||||
|
ENDMETHOD.
|
||||||
|
|
||||||
|
METHOD minimum_premium.
|
||||||
|
cl_abap_unit_assert=>assert_equals(
|
||||||
|
exp = 100
|
||||||
|
act = mo_cut->calculate_premium( iv_age = 25 iv_power_kw = 50 iv_region = 'A1' iv_claim_free_years = 6 ) ).
|
||||||
|
ENDMETHOD.
|
||||||
|
|
||||||
|
METHOD all_regions.
|
||||||
|
cl_abap_unit_assert=>assert_equals(
|
||||||
|
exp = 250 msg = 'C3'
|
||||||
|
act = mo_cut->calculate_premium( iv_age = 30 iv_power_kw = 80 iv_region = 'C3' iv_claim_free_years = 0 ) ).
|
||||||
|
cl_abap_unit_assert=>assert_equals(
|
||||||
|
exp = 300 msg = 'D4'
|
||||||
|
act = mo_cut->calculate_premium( iv_age = 30 iv_power_kw = 80 iv_region = 'D4' iv_claim_free_years = 0 ) ).
|
||||||
|
cl_abap_unit_assert=>assert_equals(
|
||||||
|
exp = 350 msg = 'E5'
|
||||||
|
act = mo_cut->calculate_premium( iv_age = 30 iv_power_kw = 80 iv_region = 'E5' iv_claim_free_years = 0 ) ).
|
||||||
|
ENDMETHOD.
|
||||||
|
|
||||||
|
METHOD invalid_region.
|
||||||
|
cl_abap_unit_assert=>assert_equals(
|
||||||
|
exp = 0
|
||||||
|
act = mo_cut->calculate_premium( iv_age = 30 iv_power_kw = 80 iv_region = 'X9' iv_claim_free_years = 0 ) ).
|
||||||
|
ENDMETHOD.
|
||||||
|
|
||||||
|
METHOD invalid_inputs.
|
||||||
|
cl_abap_unit_assert=>assert_equals(
|
||||||
|
exp = 0 msg = 'age too low'
|
||||||
|
act = mo_cut->calculate_premium( iv_age = 17 iv_power_kw = 80 iv_region = 'A1' iv_claim_free_years = 0 ) ).
|
||||||
|
cl_abap_unit_assert=>assert_equals(
|
||||||
|
exp = 0 msg = 'age too high'
|
||||||
|
act = mo_cut->calculate_premium( iv_age = 100 iv_power_kw = 80 iv_region = 'A1' iv_claim_free_years = 0 ) ).
|
||||||
|
cl_abap_unit_assert=>assert_equals(
|
||||||
|
exp = 0 msg = 'power too low'
|
||||||
|
act = mo_cut->calculate_premium( iv_age = 30 iv_power_kw = 0 iv_region = 'A1' iv_claim_free_years = 0 ) ).
|
||||||
|
cl_abap_unit_assert=>assert_equals(
|
||||||
|
exp = 0 msg = 'negative claim free years'
|
||||||
|
act = mo_cut->calculate_premium( iv_age = 30 iv_power_kw = 80 iv_region = 'A1' iv_claim_free_years = -1 ) ).
|
||||||
|
ENDMETHOD.
|
||||||
|
ENDCLASS.
|
||||||
63
tasks_gen/eval/G0104/spec.md
Normal file
63
tasks_gen/eval/G0104/spec.md
Normal file
@@ -0,0 +1,63 @@
|
|||||||
|
# 1. Goal
|
||||||
|
Calculate the annual premium of a car insurance policy. An insurance program calls the calculation before it sends an offer to a customer. The program needs one premium for each policy.
|
||||||
|
|
||||||
|
# 2. Open questions
|
||||||
|
None.
|
||||||
|
|
||||||
|
# 3. Context
|
||||||
|
- Package $TMP.
|
||||||
|
- No other objects are required.
|
||||||
|
|
||||||
|
# 4. Contract
|
||||||
|
- Create the class {{P}}INSURANCE_PREMIUM in package $TMP.
|
||||||
|
- The class is public, final, and has a public constructor without parameters.
|
||||||
|
- The class has the public type TY_REGION (CHAR 2) and TY_PREMIUM (P LENGTH 8 DECIMALS 2).
|
||||||
|
- The class has one public method:
|
||||||
|
CALCULATE_PREMIUM
|
||||||
|
IMPORTING
|
||||||
|
iv_age TYPE i
|
||||||
|
iv_power_kw TYPE i
|
||||||
|
iv_region TYPE ty_region
|
||||||
|
iv_claim_free_years TYPE i
|
||||||
|
RETURNING
|
||||||
|
VALUE(rv_premium) TYPE ty_premium.
|
||||||
|
- Do not add other public methods.
|
||||||
|
|
||||||
|
# 5. Business rules
|
||||||
|
Apply the rules in this sequence.
|
||||||
|
1. Validate the inputs:
|
||||||
|
- iv_age must be between 18 and 99.
|
||||||
|
- iv_power_kw must be greater than 0.
|
||||||
|
- iv_claim_free_years must not be negative.
|
||||||
|
- iv_region must be one of the known regions (see rule 2).
|
||||||
|
If any check fails, return 0.
|
||||||
|
2. The base premium depends on the region:
|
||||||
|
A1: 150, B2: 200, C3: 250, D4: 300, E5: 350.
|
||||||
|
3. The age factor:
|
||||||
|
- age < 25: 1.5
|
||||||
|
- 25 <= age <= 65: 1.0
|
||||||
|
- age > 65: 1.2
|
||||||
|
4. The power factor:
|
||||||
|
- power <= 50 kW: 0.9
|
||||||
|
- 51 <= power <= 100 kW: 1.0
|
||||||
|
- 101 <= power <= 150 kW: 1.3
|
||||||
|
- power > 150 kW: 1.6
|
||||||
|
5. The claim-free discount:
|
||||||
|
- Each claim-free year gives a 5% discount.
|
||||||
|
- The maximum discount is 30%.
|
||||||
|
- The discount factor is 1 minus the discount (e.g., 0 claim-free years: 1.0, 6 or more: 0.7).
|
||||||
|
6. Calculate the premium:
|
||||||
|
premium = base premium * age factor * power factor * discount factor.
|
||||||
|
Calculate with full precision and round the final result to 2 decimals.
|
||||||
|
7. If the rounded premium is less than 100, return 100.
|
||||||
|
8. Else return the rounded premium.
|
||||||
|
|
||||||
|
# 6. Constraints
|
||||||
|
- Release target: 7.58.
|
||||||
|
- Coding standards: Clean ABAP. Method length below 40 statements. No global variables. No comment that restates the code. One statement per line.
|
||||||
|
- Out of scope: do not create other objects.
|
||||||
|
|
||||||
|
# 7. Acceptance
|
||||||
|
- The class is active and has no syntax error.
|
||||||
|
- The hidden tests pass.
|
||||||
|
- Write your own ABAP Unit tests for the class.
|
||||||
40
tasks_gen/eval/G0104/task.json
Normal file
40
tasks_gen/eval/G0104/task.json
Normal file
@@ -0,0 +1,40 @@
|
|||||||
|
{
|
||||||
|
"id": "G0104",
|
||||||
|
"category": "A",
|
||||||
|
"object_type": "CLAS",
|
||||||
|
"difficulty": 2,
|
||||||
|
"release_target": "v758",
|
||||||
|
"expected_outcome": "implement",
|
||||||
|
"budget": {
|
||||||
|
"max_tool_calls": 40,
|
||||||
|
"max_activations": 10
|
||||||
|
},
|
||||||
|
"seed": [],
|
||||||
|
"contract": [
|
||||||
|
{
|
||||||
|
"type": "CLAS",
|
||||||
|
"name": "{{P}}INSURANCE_PREMIUM"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"out_of_scope": [],
|
||||||
|
"hidden_tests": [
|
||||||
|
{
|
||||||
|
"type": "CLAS",
|
||||||
|
"name": "{{P}}T02_HIDDEN",
|
||||||
|
"file": "hidden/t02_hidden.clas.abap",
|
||||||
|
"description": "T02 hidden tests"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"reference": [
|
||||||
|
{
|
||||||
|
"type": "CLAS",
|
||||||
|
"name": "{{P}}INSURANCE_PREMIUM",
|
||||||
|
"file": "reference/insurance_premium.clas.abap",
|
||||||
|
"description": "Insurance premium calculator",
|
||||||
|
"testclasses_file": "reference/insurance_premium.testclasses.abap"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"craft_checks": [
|
||||||
|
"method_length"
|
||||||
|
]
|
||||||
|
}
|
||||||
100
tasks_gen/eval/G0105/faulty/m0_toll_calc.clas.abap
Normal file
100
tasks_gen/eval/G0105/faulty/m0_toll_calc.clas.abap
Normal file
@@ -0,0 +1,100 @@
|
|||||||
|
CLASS {{p}}toll_calc DEFINITION PUBLIC FINAL CREATE PUBLIC.
|
||||||
|
PUBLIC SECTION.
|
||||||
|
METHODS calculate
|
||||||
|
IMPORTING iv_distance_km TYPE decfloat34
|
||||||
|
iv_weight_class TYPE i
|
||||||
|
iv_axles TYPE i
|
||||||
|
RETURNING VALUE(rv_fee) TYPE decfloat34
|
||||||
|
RAISING cx_abap_invalid_value.
|
||||||
|
PRIVATE SECTION.
|
||||||
|
CONSTANTS c_percent TYPE decfloat34 VALUE '100'.
|
||||||
|
CONSTANTS c_min_fee TYPE decfloat34 VALUE '1.00'.
|
||||||
|
CONSTANTS:
|
||||||
|
BEGIN OF c_rate,
|
||||||
|
class_1 TYPE decfloat34 VALUE '0.10',
|
||||||
|
class_2 TYPE decfloat34 VALUE '0.14',
|
||||||
|
class_3 TYPE decfloat34 VALUE '0.18',
|
||||||
|
class_4 TYPE decfloat34 VALUE '0.22',
|
||||||
|
END OF c_rate.
|
||||||
|
CONSTANTS:
|
||||||
|
BEGIN OF c_surcharge,
|
||||||
|
axles_2 TYPE decfloat34 VALUE '0',
|
||||||
|
axles_3 TYPE decfloat34 VALUE '5',
|
||||||
|
axles_4 TYPE decfloat34 VALUE '10',
|
||||||
|
axles_5 TYPE decfloat34 VALUE '15',
|
||||||
|
END OF c_surcharge.
|
||||||
|
|
||||||
|
METHODS check_input
|
||||||
|
IMPORTING iv_distance_km TYPE decfloat34
|
||||||
|
iv_weight_class TYPE i
|
||||||
|
iv_axles TYPE i
|
||||||
|
RAISING cx_abap_invalid_value.
|
||||||
|
METHODS base_rate
|
||||||
|
IMPORTING iv_weight_class TYPE i
|
||||||
|
RETURNING VALUE(rv_rate) TYPE decfloat34.
|
||||||
|
METHODS surcharge
|
||||||
|
IMPORTING iv_axles TYPE i
|
||||||
|
RETURNING VALUE(rv_percent) TYPE decfloat34.
|
||||||
|
ENDCLASS.
|
||||||
|
|
||||||
|
|
||||||
|
CLASS {{p}}toll_calc IMPLEMENTATION.
|
||||||
|
|
||||||
|
METHOD calculate.
|
||||||
|
check_input(
|
||||||
|
iv_distance_km = iv_distance_km
|
||||||
|
iv_weight_class = iv_weight_class
|
||||||
|
iv_axles = iv_axles ).
|
||||||
|
|
||||||
|
DATA(lv_amount) = iv_distance_km * base_rate( iv_weight_class ).
|
||||||
|
lv_amount = lv_amount * ( c_percent - surcharge( iv_axles ) ) / c_percent.
|
||||||
|
rv_fee = round( val = lv_amount dec = 2 mode = cl_abap_math=>round_half_up ).
|
||||||
|
|
||||||
|
IF rv_fee < c_min_fee.
|
||||||
|
rv_fee = c_min_fee.
|
||||||
|
ENDIF.
|
||||||
|
ENDMETHOD.
|
||||||
|
|
||||||
|
METHOD check_input.
|
||||||
|
IF iv_distance_km < 0.
|
||||||
|
RAISE EXCEPTION NEW cx_abap_invalid_value( ).
|
||||||
|
ENDIF.
|
||||||
|
IF iv_weight_class < 1 OR iv_weight_class > 4.
|
||||||
|
RAISE EXCEPTION NEW cx_abap_invalid_value( ).
|
||||||
|
ENDIF.
|
||||||
|
IF iv_axles < 2 OR iv_axles > 5.
|
||||||
|
RAISE EXCEPTION NEW cx_abap_invalid_value( ).
|
||||||
|
ENDIF.
|
||||||
|
ENDMETHOD.
|
||||||
|
|
||||||
|
METHOD base_rate.
|
||||||
|
CASE iv_weight_class.
|
||||||
|
WHEN 1.
|
||||||
|
rv_rate = c_rate-class_1.
|
||||||
|
WHEN 2.
|
||||||
|
rv_rate = c_rate-class_2.
|
||||||
|
WHEN 3.
|
||||||
|
rv_rate = c_rate-class_3.
|
||||||
|
WHEN 4.
|
||||||
|
rv_rate = c_rate-class_4.
|
||||||
|
WHEN OTHERS.
|
||||||
|
rv_rate = 0.
|
||||||
|
ENDCASE.
|
||||||
|
ENDMETHOD.
|
||||||
|
|
||||||
|
METHOD surcharge.
|
||||||
|
CASE iv_axles.
|
||||||
|
WHEN 2.
|
||||||
|
rv_percent = c_surcharge-axles_2.
|
||||||
|
WHEN 3.
|
||||||
|
rv_percent = c_surcharge-axles_3.
|
||||||
|
WHEN 4.
|
||||||
|
rv_percent = c_surcharge-axles_4.
|
||||||
|
WHEN 5.
|
||||||
|
rv_percent = c_surcharge-axles_5.
|
||||||
|
WHEN OTHERS.
|
||||||
|
rv_percent = 0.
|
||||||
|
ENDCASE.
|
||||||
|
ENDMETHOD.
|
||||||
|
|
||||||
|
ENDCLASS.
|
||||||
100
tasks_gen/eval/G0105/faulty/m1_toll_calc.clas.abap
Normal file
100
tasks_gen/eval/G0105/faulty/m1_toll_calc.clas.abap
Normal file
@@ -0,0 +1,100 @@
|
|||||||
|
CLASS {{p}}toll_calc DEFINITION PUBLIC FINAL CREATE PUBLIC.
|
||||||
|
PUBLIC SECTION.
|
||||||
|
METHODS calculate
|
||||||
|
IMPORTING iv_distance_km TYPE decfloat34
|
||||||
|
iv_weight_class TYPE i
|
||||||
|
iv_axles TYPE i
|
||||||
|
RETURNING VALUE(rv_fee) TYPE decfloat34
|
||||||
|
RAISING cx_abap_invalid_value.
|
||||||
|
PRIVATE SECTION.
|
||||||
|
CONSTANTS c_percent TYPE decfloat34 VALUE '100'.
|
||||||
|
CONSTANTS c_min_fee TYPE decfloat34 VALUE '1.00'.
|
||||||
|
CONSTANTS:
|
||||||
|
BEGIN OF c_rate,
|
||||||
|
class_1 TYPE decfloat34 VALUE '0.10',
|
||||||
|
class_2 TYPE decfloat34 VALUE '0.14',
|
||||||
|
class_3 TYPE decfloat34 VALUE '0.18',
|
||||||
|
class_4 TYPE decfloat34 VALUE '0.22',
|
||||||
|
END OF c_rate.
|
||||||
|
CONSTANTS:
|
||||||
|
BEGIN OF c_surcharge,
|
||||||
|
axles_2 TYPE decfloat34 VALUE '0',
|
||||||
|
axles_3 TYPE decfloat34 VALUE '5',
|
||||||
|
axles_4 TYPE decfloat34 VALUE '10',
|
||||||
|
axles_5 TYPE decfloat34 VALUE '15',
|
||||||
|
END OF c_surcharge.
|
||||||
|
|
||||||
|
METHODS check_input
|
||||||
|
IMPORTING iv_distance_km TYPE decfloat34
|
||||||
|
iv_weight_class TYPE i
|
||||||
|
iv_axles TYPE i
|
||||||
|
RAISING cx_abap_invalid_value.
|
||||||
|
METHODS base_rate
|
||||||
|
IMPORTING iv_weight_class TYPE i
|
||||||
|
RETURNING VALUE(rv_rate) TYPE decfloat34.
|
||||||
|
METHODS surcharge
|
||||||
|
IMPORTING iv_axles TYPE i
|
||||||
|
RETURNING VALUE(rv_percent) TYPE decfloat34.
|
||||||
|
ENDCLASS.
|
||||||
|
|
||||||
|
|
||||||
|
CLASS {{p}}toll_calc IMPLEMENTATION.
|
||||||
|
|
||||||
|
METHOD calculate.
|
||||||
|
check_input(
|
||||||
|
iv_distance_km = iv_distance_km
|
||||||
|
iv_weight_class = iv_weight_class
|
||||||
|
iv_axles = iv_axles ).
|
||||||
|
|
||||||
|
DATA(lv_amount) = iv_distance_km * base_rate( iv_weight_class ).
|
||||||
|
lv_amount = lv_amount * ( c_percent + surcharge( iv_axles ) ) / c_percent.
|
||||||
|
rv_fee = round( val = lv_amount dec = 3 mode = cl_abap_math=>round_half_up ).
|
||||||
|
|
||||||
|
IF rv_fee < c_min_fee.
|
||||||
|
rv_fee = c_min_fee.
|
||||||
|
ENDIF.
|
||||||
|
ENDMETHOD.
|
||||||
|
|
||||||
|
METHOD check_input.
|
||||||
|
IF iv_distance_km < 0.
|
||||||
|
RAISE EXCEPTION NEW cx_abap_invalid_value( ).
|
||||||
|
ENDIF.
|
||||||
|
IF iv_weight_class < 1 OR iv_weight_class > 4.
|
||||||
|
RAISE EXCEPTION NEW cx_abap_invalid_value( ).
|
||||||
|
ENDIF.
|
||||||
|
IF iv_axles < 2 OR iv_axles > 5.
|
||||||
|
RAISE EXCEPTION NEW cx_abap_invalid_value( ).
|
||||||
|
ENDIF.
|
||||||
|
ENDMETHOD.
|
||||||
|
|
||||||
|
METHOD base_rate.
|
||||||
|
CASE iv_weight_class.
|
||||||
|
WHEN 1.
|
||||||
|
rv_rate = c_rate-class_1.
|
||||||
|
WHEN 2.
|
||||||
|
rv_rate = c_rate-class_2.
|
||||||
|
WHEN 3.
|
||||||
|
rv_rate = c_rate-class_3.
|
||||||
|
WHEN 4.
|
||||||
|
rv_rate = c_rate-class_4.
|
||||||
|
WHEN OTHERS.
|
||||||
|
rv_rate = 0.
|
||||||
|
ENDCASE.
|
||||||
|
ENDMETHOD.
|
||||||
|
|
||||||
|
METHOD surcharge.
|
||||||
|
CASE iv_axles.
|
||||||
|
WHEN 2.
|
||||||
|
rv_percent = c_surcharge-axles_2.
|
||||||
|
WHEN 3.
|
||||||
|
rv_percent = c_surcharge-axles_3.
|
||||||
|
WHEN 4.
|
||||||
|
rv_percent = c_surcharge-axles_4.
|
||||||
|
WHEN 5.
|
||||||
|
rv_percent = c_surcharge-axles_5.
|
||||||
|
WHEN OTHERS.
|
||||||
|
rv_percent = 0.
|
||||||
|
ENDCASE.
|
||||||
|
ENDMETHOD.
|
||||||
|
|
||||||
|
ENDCLASS.
|
||||||
100
tasks_gen/eval/G0105/faulty/m2_toll_calc.clas.abap
Normal file
100
tasks_gen/eval/G0105/faulty/m2_toll_calc.clas.abap
Normal file
@@ -0,0 +1,100 @@
|
|||||||
|
CLASS {{p}}toll_calc DEFINITION PUBLIC FINAL CREATE PUBLIC.
|
||||||
|
PUBLIC SECTION.
|
||||||
|
METHODS calculate
|
||||||
|
IMPORTING iv_distance_km TYPE decfloat34
|
||||||
|
iv_weight_class TYPE i
|
||||||
|
iv_axles TYPE i
|
||||||
|
RETURNING VALUE(rv_fee) TYPE decfloat34
|
||||||
|
RAISING cx_abap_invalid_value.
|
||||||
|
PRIVATE SECTION.
|
||||||
|
CONSTANTS c_percent TYPE decfloat34 VALUE '100'.
|
||||||
|
CONSTANTS c_min_fee TYPE decfloat34 VALUE '1.00'.
|
||||||
|
CONSTANTS:
|
||||||
|
BEGIN OF c_rate,
|
||||||
|
class_1 TYPE decfloat34 VALUE '0.10',
|
||||||
|
class_2 TYPE decfloat34 VALUE '0.14',
|
||||||
|
class_3 TYPE decfloat34 VALUE '0.18',
|
||||||
|
class_4 TYPE decfloat34 VALUE '0.22',
|
||||||
|
END OF c_rate.
|
||||||
|
CONSTANTS:
|
||||||
|
BEGIN OF c_surcharge,
|
||||||
|
axles_2 TYPE decfloat34 VALUE '0',
|
||||||
|
axles_3 TYPE decfloat34 VALUE '5',
|
||||||
|
axles_4 TYPE decfloat34 VALUE '10',
|
||||||
|
axles_5 TYPE decfloat34 VALUE '15',
|
||||||
|
END OF c_surcharge.
|
||||||
|
|
||||||
|
METHODS check_input
|
||||||
|
IMPORTING iv_distance_km TYPE decfloat34
|
||||||
|
iv_weight_class TYPE i
|
||||||
|
iv_axles TYPE i
|
||||||
|
RAISING cx_abap_invalid_value.
|
||||||
|
METHODS base_rate
|
||||||
|
IMPORTING iv_weight_class TYPE i
|
||||||
|
RETURNING VALUE(rv_rate) TYPE decfloat34.
|
||||||
|
METHODS surcharge
|
||||||
|
IMPORTING iv_axles TYPE i
|
||||||
|
RETURNING VALUE(rv_percent) TYPE decfloat34.
|
||||||
|
ENDCLASS.
|
||||||
|
|
||||||
|
|
||||||
|
CLASS {{p}}toll_calc IMPLEMENTATION.
|
||||||
|
|
||||||
|
METHOD calculate.
|
||||||
|
check_input(
|
||||||
|
iv_distance_km = iv_distance_km
|
||||||
|
iv_weight_class = iv_weight_class
|
||||||
|
iv_axles = iv_axles ).
|
||||||
|
|
||||||
|
DATA(lv_amount) = iv_distance_km * base_rate( iv_weight_class ).
|
||||||
|
lv_amount = lv_amount * ( c_percent + surcharge( iv_axles ) ) / c_percent.
|
||||||
|
rv_fee = round( val = lv_amount dec = 2 mode = cl_abap_math=>round_half_up ).
|
||||||
|
|
||||||
|
IF rv_fee >= c_min_fee.
|
||||||
|
rv_fee = c_min_fee.
|
||||||
|
ENDIF.
|
||||||
|
ENDMETHOD.
|
||||||
|
|
||||||
|
METHOD check_input.
|
||||||
|
IF iv_distance_km < 0.
|
||||||
|
RAISE EXCEPTION NEW cx_abap_invalid_value( ).
|
||||||
|
ENDIF.
|
||||||
|
IF iv_weight_class < 1 OR iv_weight_class > 4.
|
||||||
|
RAISE EXCEPTION NEW cx_abap_invalid_value( ).
|
||||||
|
ENDIF.
|
||||||
|
IF iv_axles < 2 OR iv_axles > 5.
|
||||||
|
RAISE EXCEPTION NEW cx_abap_invalid_value( ).
|
||||||
|
ENDIF.
|
||||||
|
ENDMETHOD.
|
||||||
|
|
||||||
|
METHOD base_rate.
|
||||||
|
CASE iv_weight_class.
|
||||||
|
WHEN 1.
|
||||||
|
rv_rate = c_rate-class_1.
|
||||||
|
WHEN 2.
|
||||||
|
rv_rate = c_rate-class_2.
|
||||||
|
WHEN 3.
|
||||||
|
rv_rate = c_rate-class_3.
|
||||||
|
WHEN 4.
|
||||||
|
rv_rate = c_rate-class_4.
|
||||||
|
WHEN OTHERS.
|
||||||
|
rv_rate = 0.
|
||||||
|
ENDCASE.
|
||||||
|
ENDMETHOD.
|
||||||
|
|
||||||
|
METHOD surcharge.
|
||||||
|
CASE iv_axles.
|
||||||
|
WHEN 2.
|
||||||
|
rv_percent = c_surcharge-axles_2.
|
||||||
|
WHEN 3.
|
||||||
|
rv_percent = c_surcharge-axles_3.
|
||||||
|
WHEN 4.
|
||||||
|
rv_percent = c_surcharge-axles_4.
|
||||||
|
WHEN 5.
|
||||||
|
rv_percent = c_surcharge-axles_5.
|
||||||
|
WHEN OTHERS.
|
||||||
|
rv_percent = 0.
|
||||||
|
ENDCASE.
|
||||||
|
ENDMETHOD.
|
||||||
|
|
||||||
|
ENDCLASS.
|
||||||
100
tasks_gen/eval/G0105/faulty/m3_toll_calc.clas.abap
Normal file
100
tasks_gen/eval/G0105/faulty/m3_toll_calc.clas.abap
Normal file
@@ -0,0 +1,100 @@
|
|||||||
|
CLASS {{p}}toll_calc DEFINITION PUBLIC FINAL CREATE PUBLIC.
|
||||||
|
PUBLIC SECTION.
|
||||||
|
METHODS calculate
|
||||||
|
IMPORTING iv_distance_km TYPE decfloat34
|
||||||
|
iv_weight_class TYPE i
|
||||||
|
iv_axles TYPE i
|
||||||
|
RETURNING VALUE(rv_fee) TYPE decfloat34
|
||||||
|
RAISING cx_abap_invalid_value.
|
||||||
|
PRIVATE SECTION.
|
||||||
|
CONSTANTS c_percent TYPE decfloat34 VALUE '100'.
|
||||||
|
CONSTANTS c_min_fee TYPE decfloat34 VALUE '1.00'.
|
||||||
|
CONSTANTS:
|
||||||
|
BEGIN OF c_rate,
|
||||||
|
class_1 TYPE decfloat34 VALUE '0.10',
|
||||||
|
class_2 TYPE decfloat34 VALUE '0.14',
|
||||||
|
class_3 TYPE decfloat34 VALUE '0.18',
|
||||||
|
class_4 TYPE decfloat34 VALUE '0.22',
|
||||||
|
END OF c_rate.
|
||||||
|
CONSTANTS:
|
||||||
|
BEGIN OF c_surcharge,
|
||||||
|
axles_2 TYPE decfloat34 VALUE '0',
|
||||||
|
axles_3 TYPE decfloat34 VALUE '5',
|
||||||
|
axles_4 TYPE decfloat34 VALUE '10',
|
||||||
|
axles_5 TYPE decfloat34 VALUE '15',
|
||||||
|
END OF c_surcharge.
|
||||||
|
|
||||||
|
METHODS check_input
|
||||||
|
IMPORTING iv_distance_km TYPE decfloat34
|
||||||
|
iv_weight_class TYPE i
|
||||||
|
iv_axles TYPE i
|
||||||
|
RAISING cx_abap_invalid_value.
|
||||||
|
METHODS base_rate
|
||||||
|
IMPORTING iv_weight_class TYPE i
|
||||||
|
RETURNING VALUE(rv_rate) TYPE decfloat34.
|
||||||
|
METHODS surcharge
|
||||||
|
IMPORTING iv_axles TYPE i
|
||||||
|
RETURNING VALUE(rv_percent) TYPE decfloat34.
|
||||||
|
ENDCLASS.
|
||||||
|
|
||||||
|
|
||||||
|
CLASS {{p}}toll_calc IMPLEMENTATION.
|
||||||
|
|
||||||
|
METHOD calculate.
|
||||||
|
check_input(
|
||||||
|
iv_distance_km = iv_distance_km
|
||||||
|
iv_weight_class = iv_weight_class
|
||||||
|
iv_axles = iv_axles ).
|
||||||
|
|
||||||
|
DATA(lv_amount) = iv_distance_km * base_rate( iv_weight_class ).
|
||||||
|
lv_amount = lv_amount * ( c_percent + surcharge( iv_axles ) ) / c_percent.
|
||||||
|
rv_fee = round( val = lv_amount dec = 2 mode = cl_abap_math=>round_half_up ).
|
||||||
|
|
||||||
|
IF rv_fee < c_min_fee.
|
||||||
|
rv_fee = c_min_fee.
|
||||||
|
ENDIF.
|
||||||
|
ENDMETHOD.
|
||||||
|
|
||||||
|
METHOD check_input.
|
||||||
|
IF iv_distance_km < 0.
|
||||||
|
RAISE EXCEPTION NEW cx_abap_invalid_value( ).
|
||||||
|
ENDIF.
|
||||||
|
IF iv_weight_class < 2 OR iv_weight_class > 4.
|
||||||
|
RAISE EXCEPTION NEW cx_abap_invalid_value( ).
|
||||||
|
ENDIF.
|
||||||
|
IF iv_axles < 2 OR iv_axles > 5.
|
||||||
|
RAISE EXCEPTION NEW cx_abap_invalid_value( ).
|
||||||
|
ENDIF.
|
||||||
|
ENDMETHOD.
|
||||||
|
|
||||||
|
METHOD base_rate.
|
||||||
|
CASE iv_weight_class.
|
||||||
|
WHEN 1.
|
||||||
|
rv_rate = c_rate-class_1.
|
||||||
|
WHEN 2.
|
||||||
|
rv_rate = c_rate-class_2.
|
||||||
|
WHEN 3.
|
||||||
|
rv_rate = c_rate-class_3.
|
||||||
|
WHEN 4.
|
||||||
|
rv_rate = c_rate-class_4.
|
||||||
|
WHEN OTHERS.
|
||||||
|
rv_rate = 0.
|
||||||
|
ENDCASE.
|
||||||
|
ENDMETHOD.
|
||||||
|
|
||||||
|
METHOD surcharge.
|
||||||
|
CASE iv_axles.
|
||||||
|
WHEN 2.
|
||||||
|
rv_percent = c_surcharge-axles_2.
|
||||||
|
WHEN 3.
|
||||||
|
rv_percent = c_surcharge-axles_3.
|
||||||
|
WHEN 4.
|
||||||
|
rv_percent = c_surcharge-axles_4.
|
||||||
|
WHEN 5.
|
||||||
|
rv_percent = c_surcharge-axles_5.
|
||||||
|
WHEN OTHERS.
|
||||||
|
rv_percent = 0.
|
||||||
|
ENDCASE.
|
||||||
|
ENDMETHOD.
|
||||||
|
|
||||||
|
ENDCLASS.
|
||||||
100
tasks_gen/eval/G0105/faulty/m4_toll_calc.clas.abap
Normal file
100
tasks_gen/eval/G0105/faulty/m4_toll_calc.clas.abap
Normal file
@@ -0,0 +1,100 @@
|
|||||||
|
CLASS {{p}}toll_calc DEFINITION PUBLIC FINAL CREATE PUBLIC.
|
||||||
|
PUBLIC SECTION.
|
||||||
|
METHODS calculate
|
||||||
|
IMPORTING iv_distance_km TYPE decfloat34
|
||||||
|
iv_weight_class TYPE i
|
||||||
|
iv_axles TYPE i
|
||||||
|
RETURNING VALUE(rv_fee) TYPE decfloat34
|
||||||
|
RAISING cx_abap_invalid_value.
|
||||||
|
PRIVATE SECTION.
|
||||||
|
CONSTANTS c_percent TYPE decfloat34 VALUE '100'.
|
||||||
|
CONSTANTS c_min_fee TYPE decfloat34 VALUE '1.00'.
|
||||||
|
CONSTANTS:
|
||||||
|
BEGIN OF c_rate,
|
||||||
|
class_1 TYPE decfloat34 VALUE '0.10',
|
||||||
|
class_2 TYPE decfloat34 VALUE '0.14',
|
||||||
|
class_3 TYPE decfloat34 VALUE '0.18',
|
||||||
|
class_4 TYPE decfloat34 VALUE '0.22',
|
||||||
|
END OF c_rate.
|
||||||
|
CONSTANTS:
|
||||||
|
BEGIN OF c_surcharge,
|
||||||
|
axles_2 TYPE decfloat34 VALUE '0',
|
||||||
|
axles_3 TYPE decfloat34 VALUE '5',
|
||||||
|
axles_4 TYPE decfloat34 VALUE '10',
|
||||||
|
axles_5 TYPE decfloat34 VALUE '15',
|
||||||
|
END OF c_surcharge.
|
||||||
|
|
||||||
|
METHODS check_input
|
||||||
|
IMPORTING iv_distance_km TYPE decfloat34
|
||||||
|
iv_weight_class TYPE i
|
||||||
|
iv_axles TYPE i
|
||||||
|
RAISING cx_abap_invalid_value.
|
||||||
|
METHODS base_rate
|
||||||
|
IMPORTING iv_weight_class TYPE i
|
||||||
|
RETURNING VALUE(rv_rate) TYPE decfloat34.
|
||||||
|
METHODS surcharge
|
||||||
|
IMPORTING iv_axles TYPE i
|
||||||
|
RETURNING VALUE(rv_percent) TYPE decfloat34.
|
||||||
|
ENDCLASS.
|
||||||
|
|
||||||
|
|
||||||
|
CLASS {{p}}toll_calc IMPLEMENTATION.
|
||||||
|
|
||||||
|
METHOD calculate.
|
||||||
|
check_input(
|
||||||
|
iv_distance_km = iv_distance_km
|
||||||
|
iv_weight_class = iv_weight_class
|
||||||
|
iv_axles = iv_axles ).
|
||||||
|
|
||||||
|
DATA(lv_amount) = iv_distance_km * base_rate( iv_weight_class ).
|
||||||
|
lv_amount = lv_amount * ( c_percent + surcharge( iv_axles ) ) / c_percent.
|
||||||
|
rv_fee = round( val = lv_amount dec = 2 mode = cl_abap_math=>round_half_up ).
|
||||||
|
|
||||||
|
IF rv_fee < c_min_fee.
|
||||||
|
rv_fee = c_min_fee.
|
||||||
|
ENDIF.
|
||||||
|
ENDMETHOD.
|
||||||
|
|
||||||
|
METHOD check_input.
|
||||||
|
IF iv_distance_km < 0.
|
||||||
|
RAISE EXCEPTION NEW cx_abap_invalid_value( ).
|
||||||
|
ENDIF.
|
||||||
|
IF iv_weight_class < 1 AND iv_weight_class > 4.
|
||||||
|
RAISE EXCEPTION NEW cx_abap_invalid_value( ).
|
||||||
|
ENDIF.
|
||||||
|
IF iv_axles < 2 OR iv_axles > 5.
|
||||||
|
RAISE EXCEPTION NEW cx_abap_invalid_value( ).
|
||||||
|
ENDIF.
|
||||||
|
ENDMETHOD.
|
||||||
|
|
||||||
|
METHOD base_rate.
|
||||||
|
CASE iv_weight_class.
|
||||||
|
WHEN 1.
|
||||||
|
rv_rate = c_rate-class_1.
|
||||||
|
WHEN 2.
|
||||||
|
rv_rate = c_rate-class_2.
|
||||||
|
WHEN 3.
|
||||||
|
rv_rate = c_rate-class_3.
|
||||||
|
WHEN 4.
|
||||||
|
rv_rate = c_rate-class_4.
|
||||||
|
WHEN OTHERS.
|
||||||
|
rv_rate = 0.
|
||||||
|
ENDCASE.
|
||||||
|
ENDMETHOD.
|
||||||
|
|
||||||
|
METHOD surcharge.
|
||||||
|
CASE iv_axles.
|
||||||
|
WHEN 2.
|
||||||
|
rv_percent = c_surcharge-axles_2.
|
||||||
|
WHEN 3.
|
||||||
|
rv_percent = c_surcharge-axles_3.
|
||||||
|
WHEN 4.
|
||||||
|
rv_percent = c_surcharge-axles_4.
|
||||||
|
WHEN 5.
|
||||||
|
rv_percent = c_surcharge-axles_5.
|
||||||
|
WHEN OTHERS.
|
||||||
|
rv_percent = 0.
|
||||||
|
ENDCASE.
|
||||||
|
ENDMETHOD.
|
||||||
|
|
||||||
|
ENDCLASS.
|
||||||
33
tasks_gen/eval/G0105/generation.json
Normal file
33
tasks_gen/eval/G0105/generation.json
Normal file
@@ -0,0 +1,33 @@
|
|||||||
|
{
|
||||||
|
"id": "G0105",
|
||||||
|
"pool": "eval",
|
||||||
|
"object_type": "FUNC",
|
||||||
|
"category": "A",
|
||||||
|
"attempts": [
|
||||||
|
{
|
||||||
|
"stage": "validate",
|
||||||
|
"oracle": 0,
|
||||||
|
"null": 0
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"stage": "bundle",
|
||||||
|
"errors": [
|
||||||
|
"reference/toll_calc.testclasses.abap line 63: syntax error for release v758 (abaplint): Statement does not exist in the configured ABAP version(or a parser error), \"cl_abap_unit_assert\""
|
||||||
|
],
|
||||||
|
"by_check": {
|
||||||
|
"abaplint": 1
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"stage": "validate",
|
||||||
|
"oracle": 100.0,
|
||||||
|
"null": 0,
|
||||||
|
"mutation": {
|
||||||
|
"valid": 5,
|
||||||
|
"killed": 5,
|
||||||
|
"ok": true
|
||||||
|
}
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"accepted": true
|
||||||
|
}
|
||||||
140
tasks_gen/eval/G0105/hidden/t14_hidden.clas.abap
Normal file
140
tasks_gen/eval/G0105/hidden/t14_hidden.clas.abap
Normal file
@@ -0,0 +1,140 @@
|
|||||||
|
CLASS {{p}}t14_hidden DEFINITION PUBLIC FINAL CREATE PUBLIC
|
||||||
|
FOR TESTING DURATION SHORT RISK LEVEL HARMLESS.
|
||||||
|
|
||||||
|
PRIVATE SECTION.
|
||||||
|
METHODS fee_for
|
||||||
|
IMPORTING iv_km TYPE decfloat34
|
||||||
|
iv_class TYPE i
|
||||||
|
iv_axles TYPE i
|
||||||
|
RETURNING VALUE(rv_fee) TYPE decfloat34.
|
||||||
|
METHODS is_rejected
|
||||||
|
IMPORTING iv_km TYPE decfloat34
|
||||||
|
iv_class TYPE i
|
||||||
|
iv_axles TYPE i
|
||||||
|
RETURNING VALUE(rv_rejected) TYPE abap_bool.
|
||||||
|
METHODS fee_two_axles FOR TESTING.
|
||||||
|
METHODS fee_three_axles FOR TESTING.
|
||||||
|
METHODS fee_four_axles FOR TESTING.
|
||||||
|
METHODS fee_five_axles FOR TESTING.
|
||||||
|
METHODS rounding_half_up FOR TESTING.
|
||||||
|
METHODS minimum_fee FOR TESTING.
|
||||||
|
METHODS rejects_negative_km FOR TESTING.
|
||||||
|
METHODS rejects_bad_class FOR TESTING.
|
||||||
|
METHODS rejects_bad_axles FOR TESTING.
|
||||||
|
METHODS func_returns_fee FOR TESTING.
|
||||||
|
METHODS func_rejects_input FOR TESTING.
|
||||||
|
ENDCLASS.
|
||||||
|
|
||||||
|
|
||||||
|
CLASS {{p}}t14_hidden IMPLEMENTATION.
|
||||||
|
|
||||||
|
METHOD fee_for.
|
||||||
|
TRY.
|
||||||
|
rv_fee = NEW {{p}}toll_calc( )->calculate(
|
||||||
|
iv_distance_km = iv_km
|
||||||
|
iv_weight_class = iv_class
|
||||||
|
iv_axles = iv_axles ).
|
||||||
|
CATCH cx_abap_invalid_value.
|
||||||
|
rv_fee = -1.
|
||||||
|
ENDTRY.
|
||||||
|
ENDMETHOD.
|
||||||
|
|
||||||
|
METHOD is_rejected.
|
||||||
|
DATA lv_fee TYPE decfloat34.
|
||||||
|
lv_fee = fee_for( iv_km = iv_km iv_class = iv_class iv_axles = iv_axles ).
|
||||||
|
rv_rejected = boolc( lv_fee < 0 ).
|
||||||
|
ENDMETHOD.
|
||||||
|
|
||||||
|
METHOD fee_two_axles.
|
||||||
|
DATA lv_fee TYPE decfloat34.
|
||||||
|
lv_fee = fee_for( iv_km = 100 iv_class = 1 iv_axles = 2 ).
|
||||||
|
cl_abap_unit_assert=>assert_equals( exp = CONV decfloat34( '10.00' ) act = lv_fee ).
|
||||||
|
ENDMETHOD.
|
||||||
|
|
||||||
|
METHOD fee_three_axles.
|
||||||
|
DATA lv_fee TYPE decfloat34.
|
||||||
|
lv_fee = fee_for( iv_km = 100 iv_class = 2 iv_axles = 3 ).
|
||||||
|
cl_abap_unit_assert=>assert_equals( exp = CONV decfloat34( '14.70' ) act = lv_fee ).
|
||||||
|
ENDMETHOD.
|
||||||
|
|
||||||
|
METHOD fee_four_axles.
|
||||||
|
DATA lv_fee TYPE decfloat34.
|
||||||
|
lv_fee = fee_for( iv_km = 100 iv_class = 3 iv_axles = 4 ).
|
||||||
|
cl_abap_unit_assert=>assert_equals( exp = CONV decfloat34( '19.80' ) act = lv_fee ).
|
||||||
|
ENDMETHOD.
|
||||||
|
|
||||||
|
METHOD fee_five_axles.
|
||||||
|
DATA lv_fee TYPE decfloat34.
|
||||||
|
lv_fee = fee_for( iv_km = 100 iv_class = 4 iv_axles = 5 ).
|
||||||
|
cl_abap_unit_assert=>assert_equals( exp = CONV decfloat34( '25.30' ) act = lv_fee ).
|
||||||
|
ENDMETHOD.
|
||||||
|
|
||||||
|
METHOD rounding_half_up.
|
||||||
|
DATA lv_fee TYPE decfloat34.
|
||||||
|
lv_fee = fee_for( iv_km = 25 iv_class = 1 iv_axles = 3 ).
|
||||||
|
cl_abap_unit_assert=>assert_equals( exp = CONV decfloat34( '2.63' ) act = lv_fee ).
|
||||||
|
ENDMETHOD.
|
||||||
|
|
||||||
|
METHOD minimum_fee.
|
||||||
|
DATA lv_fee TYPE decfloat34.
|
||||||
|
lv_fee = fee_for( iv_km = 5 iv_class = 1 iv_axles = 2 ).
|
||||||
|
cl_abap_unit_assert=>assert_equals( exp = CONV decfloat34( '1.00' ) act = lv_fee ).
|
||||||
|
lv_fee = fee_for( iv_km = 0 iv_class = 1 iv_axles = 2 ).
|
||||||
|
cl_abap_unit_assert=>assert_equals( exp = CONV decfloat34( '1.00' ) act = lv_fee ).
|
||||||
|
ENDMETHOD.
|
||||||
|
|
||||||
|
METHOD rejects_negative_km.
|
||||||
|
DATA lv_rejected TYPE abap_bool.
|
||||||
|
lv_rejected = is_rejected( iv_km = -1 iv_class = 1 iv_axles = 2 ).
|
||||||
|
cl_abap_unit_assert=>assert_true( act = lv_rejected ).
|
||||||
|
ENDMETHOD.
|
||||||
|
|
||||||
|
METHOD rejects_bad_class.
|
||||||
|
DATA lv_rejected TYPE abap_bool.
|
||||||
|
lv_rejected = is_rejected( iv_km = 100 iv_class = 0 iv_axles = 2 ).
|
||||||
|
cl_abap_unit_assert=>assert_true( act = lv_rejected ).
|
||||||
|
lv_rejected = is_rejected( iv_km = 100 iv_class = 5 iv_axles = 2 ).
|
||||||
|
cl_abap_unit_assert=>assert_true( act = lv_rejected ).
|
||||||
|
ENDMETHOD.
|
||||||
|
|
||||||
|
METHOD rejects_bad_axles.
|
||||||
|
DATA lv_rejected TYPE abap_bool.
|
||||||
|
lv_rejected = is_rejected( iv_km = 100 iv_class = 1 iv_axles = 1 ).
|
||||||
|
cl_abap_unit_assert=>assert_true( act = lv_rejected ).
|
||||||
|
lv_rejected = is_rejected( iv_km = 100 iv_class = 1 iv_axles = 6 ).
|
||||||
|
cl_abap_unit_assert=>assert_true( act = lv_rejected ).
|
||||||
|
ENDMETHOD.
|
||||||
|
|
||||||
|
METHOD func_returns_fee.
|
||||||
|
DATA lv_fee TYPE decfloat34.
|
||||||
|
CALL FUNCTION '{{P}}TOLL_FEE'
|
||||||
|
EXPORTING
|
||||||
|
iv_distance_km = 100
|
||||||
|
iv_weight_class = 3
|
||||||
|
iv_axles = 4
|
||||||
|
IMPORTING
|
||||||
|
ev_fee = lv_fee
|
||||||
|
EXCEPTIONS
|
||||||
|
invalid_input = 1
|
||||||
|
OTHERS = 2.
|
||||||
|
cl_abap_unit_assert=>assert_subrc( exp = 0 ).
|
||||||
|
cl_abap_unit_assert=>assert_equals( exp = CONV decfloat34( '19.80' ) act = lv_fee ).
|
||||||
|
ENDMETHOD.
|
||||||
|
|
||||||
|
METHOD func_rejects_input.
|
||||||
|
DATA lv_fee TYPE decfloat34.
|
||||||
|
CALL FUNCTION '{{P}}TOLL_FEE'
|
||||||
|
EXPORTING
|
||||||
|
iv_distance_km = -1
|
||||||
|
iv_weight_class = 1
|
||||||
|
iv_axles = 2
|
||||||
|
IMPORTING
|
||||||
|
ev_fee = lv_fee
|
||||||
|
EXCEPTIONS
|
||||||
|
invalid_input = 1
|
||||||
|
OTHERS = 2.
|
||||||
|
cl_abap_unit_assert=>assert_equals( exp = 1 act = sy-subrc ).
|
||||||
|
cl_abap_unit_assert=>assert_initial( act = lv_fee ).
|
||||||
|
ENDMETHOD.
|
||||||
|
|
||||||
|
ENDCLASS.
|
||||||
66
tasks_gen/eval/G0105/mutation.json
Normal file
66
tasks_gen/eval/G0105/mutation.json
Normal file
@@ -0,0 +1,66 @@
|
|||||||
|
{
|
||||||
|
"task": "G0105",
|
||||||
|
"mutants": [
|
||||||
|
{
|
||||||
|
"object": "{{P}}TOLL_CALC",
|
||||||
|
"mutant": "line 50: + -> - (arith)",
|
||||||
|
"status": "killed",
|
||||||
|
"hidden": "6/11",
|
||||||
|
"failed_tests": [
|
||||||
|
"FEE_FIVE_AXLES",
|
||||||
|
"FEE_FOUR_AXLES",
|
||||||
|
"FEE_THREE_AXLES",
|
||||||
|
"FUNC_RETURNS_FEE",
|
||||||
|
"ROUNDING_HALF_UP"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"object": "{{P}}TOLL_CALC",
|
||||||
|
"mutant": "line 51: 2 -> 3 (const)",
|
||||||
|
"status": "killed",
|
||||||
|
"hidden": "10/11",
|
||||||
|
"failed_tests": [
|
||||||
|
"ROUNDING_HALF_UP"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"object": "{{P}}TOLL_CALC",
|
||||||
|
"mutant": "line 53: < -> >= (rel)",
|
||||||
|
"status": "killed",
|
||||||
|
"hidden": "4/11",
|
||||||
|
"failed_tests": [
|
||||||
|
"FEE_FIVE_AXLES",
|
||||||
|
"FEE_FOUR_AXLES",
|
||||||
|
"FEE_THREE_AXLES",
|
||||||
|
"FEE_TWO_AXLES",
|
||||||
|
"FUNC_RETURNS_FEE",
|
||||||
|
"MINIMUM_FEE",
|
||||||
|
"ROUNDING_HALF_UP"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"object": "{{P}}TOLL_CALC",
|
||||||
|
"mutant": "line 62: 1 -> 2 (const)",
|
||||||
|
"status": "killed",
|
||||||
|
"hidden": "8/11",
|
||||||
|
"failed_tests": [
|
||||||
|
"FEE_TWO_AXLES",
|
||||||
|
"MINIMUM_FEE",
|
||||||
|
"ROUNDING_HALF_UP"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"object": "{{P}}TOLL_CALC",
|
||||||
|
"mutant": "line 62: OR -> AND (logic)",
|
||||||
|
"status": "killed",
|
||||||
|
"hidden": "10/11",
|
||||||
|
"failed_tests": [
|
||||||
|
"REJECTS_BAD_CLASS"
|
||||||
|
]
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"valid": 5,
|
||||||
|
"killed": 5,
|
||||||
|
"kill_rate": 1.0,
|
||||||
|
"ok": true
|
||||||
|
}
|
||||||
62
tasks_gen/eval/G0105/reference/t14_test.clas.abap
Normal file
62
tasks_gen/eval/G0105/reference/t14_test.clas.abap
Normal file
@@ -0,0 +1,62 @@
|
|||||||
|
CLASS {{p}}t14_test DEFINITION PUBLIC FINAL CREATE PUBLIC
|
||||||
|
FOR TESTING DURATION SHORT RISK LEVEL HARMLESS.
|
||||||
|
|
||||||
|
PRIVATE SECTION.
|
||||||
|
METHODS call_fee
|
||||||
|
IMPORTING iv_km TYPE decfloat34
|
||||||
|
iv_class TYPE i
|
||||||
|
iv_axles TYPE i
|
||||||
|
EXPORTING ev_fee TYPE decfloat34
|
||||||
|
ev_subrc TYPE sysubrc.
|
||||||
|
METHODS returns_fee FOR TESTING.
|
||||||
|
METHODS rejects_input FOR TESTING.
|
||||||
|
ENDCLASS.
|
||||||
|
|
||||||
|
|
||||||
|
CLASS {{p}}t14_test IMPLEMENTATION.
|
||||||
|
|
||||||
|
METHOD call_fee.
|
||||||
|
CALL FUNCTION '{{P}}TOLL_FEE'
|
||||||
|
EXPORTING
|
||||||
|
iv_distance_km = iv_km
|
||||||
|
iv_weight_class = iv_class
|
||||||
|
iv_axles = iv_axles
|
||||||
|
IMPORTING
|
||||||
|
ev_fee = ev_fee
|
||||||
|
EXCEPTIONS
|
||||||
|
invalid_input = 1
|
||||||
|
OTHERS = 2.
|
||||||
|
ev_subrc = sy-subrc.
|
||||||
|
ENDMETHOD.
|
||||||
|
|
||||||
|
METHOD returns_fee.
|
||||||
|
DATA lv_fee TYPE decfloat34.
|
||||||
|
DATA lv_rc TYPE sysubrc.
|
||||||
|
call_fee(
|
||||||
|
EXPORTING
|
||||||
|
iv_km = 100
|
||||||
|
iv_class = 2
|
||||||
|
iv_axles = 3
|
||||||
|
IMPORTING
|
||||||
|
ev_fee = lv_fee
|
||||||
|
ev_subrc = lv_rc ).
|
||||||
|
cl_abap_unit_assert=>assert_equals( exp = 0 act = lv_rc ).
|
||||||
|
cl_abap_unit_assert=>assert_equals( exp = CONV decfloat34( '14.70' ) act = lv_fee ).
|
||||||
|
ENDMETHOD.
|
||||||
|
|
||||||
|
METHOD rejects_input.
|
||||||
|
DATA lv_fee TYPE decfloat34.
|
||||||
|
DATA lv_rc TYPE sysubrc.
|
||||||
|
call_fee(
|
||||||
|
EXPORTING
|
||||||
|
iv_km = -1
|
||||||
|
iv_class = 1
|
||||||
|
iv_axles = 2
|
||||||
|
IMPORTING
|
||||||
|
ev_fee = lv_fee
|
||||||
|
ev_subrc = lv_rc ).
|
||||||
|
cl_abap_unit_assert=>assert_equals( exp = 1 act = lv_rc ).
|
||||||
|
cl_abap_unit_assert=>assert_initial( act = lv_fee ).
|
||||||
|
ENDMETHOD.
|
||||||
|
|
||||||
|
ENDCLASS.
|
||||||
100
tasks_gen/eval/G0105/reference/toll_calc.clas.abap
Normal file
100
tasks_gen/eval/G0105/reference/toll_calc.clas.abap
Normal file
@@ -0,0 +1,100 @@
|
|||||||
|
CLASS {{p}}toll_calc DEFINITION PUBLIC FINAL CREATE PUBLIC.
|
||||||
|
PUBLIC SECTION.
|
||||||
|
METHODS calculate
|
||||||
|
IMPORTING iv_distance_km TYPE decfloat34
|
||||||
|
iv_weight_class TYPE i
|
||||||
|
iv_axles TYPE i
|
||||||
|
RETURNING VALUE(rv_fee) TYPE decfloat34
|
||||||
|
RAISING cx_abap_invalid_value.
|
||||||
|
PRIVATE SECTION.
|
||||||
|
CONSTANTS c_percent TYPE decfloat34 VALUE '100'.
|
||||||
|
CONSTANTS c_min_fee TYPE decfloat34 VALUE '1.00'.
|
||||||
|
CONSTANTS:
|
||||||
|
BEGIN OF c_rate,
|
||||||
|
class_1 TYPE decfloat34 VALUE '0.10',
|
||||||
|
class_2 TYPE decfloat34 VALUE '0.14',
|
||||||
|
class_3 TYPE decfloat34 VALUE '0.18',
|
||||||
|
class_4 TYPE decfloat34 VALUE '0.22',
|
||||||
|
END OF c_rate.
|
||||||
|
CONSTANTS:
|
||||||
|
BEGIN OF c_surcharge,
|
||||||
|
axles_2 TYPE decfloat34 VALUE '0',
|
||||||
|
axles_3 TYPE decfloat34 VALUE '5',
|
||||||
|
axles_4 TYPE decfloat34 VALUE '10',
|
||||||
|
axles_5 TYPE decfloat34 VALUE '15',
|
||||||
|
END OF c_surcharge.
|
||||||
|
|
||||||
|
METHODS check_input
|
||||||
|
IMPORTING iv_distance_km TYPE decfloat34
|
||||||
|
iv_weight_class TYPE i
|
||||||
|
iv_axles TYPE i
|
||||||
|
RAISING cx_abap_invalid_value.
|
||||||
|
METHODS base_rate
|
||||||
|
IMPORTING iv_weight_class TYPE i
|
||||||
|
RETURNING VALUE(rv_rate) TYPE decfloat34.
|
||||||
|
METHODS surcharge
|
||||||
|
IMPORTING iv_axles TYPE i
|
||||||
|
RETURNING VALUE(rv_percent) TYPE decfloat34.
|
||||||
|
ENDCLASS.
|
||||||
|
|
||||||
|
|
||||||
|
CLASS {{p}}toll_calc IMPLEMENTATION.
|
||||||
|
|
||||||
|
METHOD calculate.
|
||||||
|
check_input(
|
||||||
|
iv_distance_km = iv_distance_km
|
||||||
|
iv_weight_class = iv_weight_class
|
||||||
|
iv_axles = iv_axles ).
|
||||||
|
|
||||||
|
DATA(lv_amount) = iv_distance_km * base_rate( iv_weight_class ).
|
||||||
|
lv_amount = lv_amount * ( c_percent + surcharge( iv_axles ) ) / c_percent.
|
||||||
|
rv_fee = round( val = lv_amount dec = 2 mode = cl_abap_math=>round_half_up ).
|
||||||
|
|
||||||
|
IF rv_fee < c_min_fee.
|
||||||
|
rv_fee = c_min_fee.
|
||||||
|
ENDIF.
|
||||||
|
ENDMETHOD.
|
||||||
|
|
||||||
|
METHOD check_input.
|
||||||
|
IF iv_distance_km < 0.
|
||||||
|
RAISE EXCEPTION NEW cx_abap_invalid_value( ).
|
||||||
|
ENDIF.
|
||||||
|
IF iv_weight_class < 1 OR iv_weight_class > 4.
|
||||||
|
RAISE EXCEPTION NEW cx_abap_invalid_value( ).
|
||||||
|
ENDIF.
|
||||||
|
IF iv_axles < 2 OR iv_axles > 5.
|
||||||
|
RAISE EXCEPTION NEW cx_abap_invalid_value( ).
|
||||||
|
ENDIF.
|
||||||
|
ENDMETHOD.
|
||||||
|
|
||||||
|
METHOD base_rate.
|
||||||
|
CASE iv_weight_class.
|
||||||
|
WHEN 1.
|
||||||
|
rv_rate = c_rate-class_1.
|
||||||
|
WHEN 2.
|
||||||
|
rv_rate = c_rate-class_2.
|
||||||
|
WHEN 3.
|
||||||
|
rv_rate = c_rate-class_3.
|
||||||
|
WHEN 4.
|
||||||
|
rv_rate = c_rate-class_4.
|
||||||
|
WHEN OTHERS.
|
||||||
|
rv_rate = 0.
|
||||||
|
ENDCASE.
|
||||||
|
ENDMETHOD.
|
||||||
|
|
||||||
|
METHOD surcharge.
|
||||||
|
CASE iv_axles.
|
||||||
|
WHEN 2.
|
||||||
|
rv_percent = c_surcharge-axles_2.
|
||||||
|
WHEN 3.
|
||||||
|
rv_percent = c_surcharge-axles_3.
|
||||||
|
WHEN 4.
|
||||||
|
rv_percent = c_surcharge-axles_4.
|
||||||
|
WHEN 5.
|
||||||
|
rv_percent = c_surcharge-axles_5.
|
||||||
|
WHEN OTHERS.
|
||||||
|
rv_percent = 0.
|
||||||
|
ENDCASE.
|
||||||
|
ENDMETHOD.
|
||||||
|
|
||||||
|
ENDCLASS.
|
||||||
65
tasks_gen/eval/G0105/reference/toll_calc.testclasses.abap
Normal file
65
tasks_gen/eval/G0105/reference/toll_calc.testclasses.abap
Normal file
@@ -0,0 +1,65 @@
|
|||||||
|
CLASS ltc_toll_calc DEFINITION FINAL FOR TESTING
|
||||||
|
DURATION SHORT
|
||||||
|
RISK LEVEL HARMLESS.
|
||||||
|
|
||||||
|
PRIVATE SECTION.
|
||||||
|
METHODS fee_for
|
||||||
|
IMPORTING iv_km TYPE decfloat34
|
||||||
|
iv_class TYPE i
|
||||||
|
iv_axles TYPE i
|
||||||
|
RETURNING VALUE(rv_fee) TYPE decfloat34.
|
||||||
|
METHODS is_rejected
|
||||||
|
IMPORTING iv_km TYPE decfloat34
|
||||||
|
iv_class TYPE i
|
||||||
|
iv_axles TYPE i
|
||||||
|
RETURNING VALUE(rv_rejected) TYPE abap_bool.
|
||||||
|
METHODS rate_and_surcharge FOR TESTING.
|
||||||
|
METHODS minimum_fee FOR TESTING.
|
||||||
|
METHODS rejects_invalid FOR TESTING.
|
||||||
|
ENDCLASS.
|
||||||
|
|
||||||
|
|
||||||
|
CLASS ltc_toll_calc IMPLEMENTATION.
|
||||||
|
|
||||||
|
METHOD fee_for.
|
||||||
|
TRY.
|
||||||
|
rv_fee = NEW {{p}}toll_calc( )->calculate(
|
||||||
|
iv_distance_km = iv_km
|
||||||
|
iv_weight_class = iv_class
|
||||||
|
iv_axles = iv_axles ).
|
||||||
|
CATCH cx_abap_invalid_value.
|
||||||
|
rv_fee = -1.
|
||||||
|
ENDTRY.
|
||||||
|
ENDMETHOD.
|
||||||
|
|
||||||
|
METHOD is_rejected.
|
||||||
|
DATA lv_fee TYPE decfloat34.
|
||||||
|
lv_fee = fee_for( iv_km = iv_km iv_class = iv_class iv_axles = iv_axles ).
|
||||||
|
rv_rejected = boolc( lv_fee < 0 ).
|
||||||
|
ENDMETHOD.
|
||||||
|
|
||||||
|
METHOD rate_and_surcharge.
|
||||||
|
DATA lv_fee TYPE decfloat34.
|
||||||
|
lv_fee = fee_for( iv_km = 100 iv_class = 1 iv_axles = 2 ).
|
||||||
|
cl_abap_unit_assert=>assert_equals( exp = CONV decfloat34( '10.00' ) act = lv_fee ).
|
||||||
|
lv_fee = fee_for( iv_km = 100 iv_class = 4 iv_axles = 5 ).
|
||||||
|
cl_abap_unit_assert=>assert_equals( exp = CONV decfloat34( '25.30' ) act = lv_fee ).
|
||||||
|
ENDMETHOD.
|
||||||
|
|
||||||
|
METHOD minimum_fee.
|
||||||
|
DATA lv_fee TYPE decfloat34.
|
||||||
|
lv_fee = fee_for( iv_km = 1 iv_class = 1 iv_axles = 2 ).
|
||||||
|
cl_abap_unit_assert=>assert_equals( exp = CONV decfloat34( '1.00' ) act = lv_fee ).
|
||||||
|
ENDMETHOD.
|
||||||
|
|
||||||
|
METHOD rejects_invalid.
|
||||||
|
DATA lv_rejected TYPE abap_bool.
|
||||||
|
lv_rejected = is_rejected( iv_km = -1 iv_class = 1 iv_axles = 2 ).
|
||||||
|
cl_abap_unit_assert=>assert_true( act = lv_rejected ).
|
||||||
|
lv_rejected = is_rejected( iv_km = 100 iv_class = 5 iv_axles = 2 ).
|
||||||
|
cl_abap_unit_assert=>assert_true( act = lv_rejected ).
|
||||||
|
lv_rejected = is_rejected( iv_km = 100 iv_class = 1 iv_axles = 6 ).
|
||||||
|
cl_abap_unit_assert=>assert_true( act = lv_rejected ).
|
||||||
|
ENDMETHOD.
|
||||||
|
|
||||||
|
ENDCLASS.
|
||||||
20
tasks_gen/eval/G0105/reference/toll_fee.func.abap
Normal file
20
tasks_gen/eval/G0105/reference/toll_fee.func.abap
Normal file
@@ -0,0 +1,20 @@
|
|||||||
|
FUNCTION {{p}}toll_fee
|
||||||
|
IMPORTING
|
||||||
|
iv_distance_km TYPE decfloat34
|
||||||
|
iv_weight_class TYPE i
|
||||||
|
iv_axles TYPE i
|
||||||
|
EXPORTING
|
||||||
|
ev_fee TYPE decfloat34
|
||||||
|
EXCEPTIONS
|
||||||
|
invalid_input.
|
||||||
|
|
||||||
|
TRY.
|
||||||
|
ev_fee = NEW {{p}}toll_calc( )->calculate(
|
||||||
|
iv_distance_km = iv_distance_km
|
||||||
|
iv_weight_class = iv_weight_class
|
||||||
|
iv_axles = iv_axles ).
|
||||||
|
CATCH cx_abap_invalid_value.
|
||||||
|
RAISE invalid_input.
|
||||||
|
ENDTRY.
|
||||||
|
|
||||||
|
ENDFUNCTION.
|
||||||
86
tasks_gen/eval/G0105/spec.md
Normal file
86
tasks_gen/eval/G0105/spec.md
Normal file
@@ -0,0 +1,86 @@
|
|||||||
|
# 1. Goal
|
||||||
|
|
||||||
|
A toll operator charges a fee for each truck trip on its road network. The trip
|
||||||
|
log program calls one function module for each trip. The call happens before
|
||||||
|
the program stores the trip. The fee depends only on the trip data that the
|
||||||
|
caller passes.
|
||||||
|
|
||||||
|
# 2. Open questions
|
||||||
|
|
||||||
|
None.
|
||||||
|
|
||||||
|
# 3. Context
|
||||||
|
|
||||||
|
- Function group {{P}}FG_TOLL exists in package $TMP.
|
||||||
|
- All objects of this task are in package $TMP.
|
||||||
|
- The trip log program is not part of this task.
|
||||||
|
|
||||||
|
# 4. Contract
|
||||||
|
|
||||||
|
## 4.1 Function module {{P}}TOLL_FEE
|
||||||
|
|
||||||
|
Create the function module {{P}}TOLL_FEE in function group {{P}}FG_TOLL.
|
||||||
|
The interface is exactly:
|
||||||
|
|
||||||
|
IMPORTING
|
||||||
|
iv_distance_km TYPE decfloat34
|
||||||
|
iv_weight_class TYPE i
|
||||||
|
iv_axles TYPE i
|
||||||
|
EXPORTING
|
||||||
|
ev_fee TYPE decfloat34
|
||||||
|
EXCEPTIONS
|
||||||
|
invalid_input
|
||||||
|
|
||||||
|
## 4.2 Class {{P}}TOLL_CALC
|
||||||
|
|
||||||
|
Create the global class {{P}}TOLL_CALC in package $TMP. The class is public and
|
||||||
|
final. The class has a public instance constructor without parameters.
|
||||||
|
The class has this public method:
|
||||||
|
|
||||||
|
METHODS calculate
|
||||||
|
IMPORTING iv_distance_km TYPE decfloat34
|
||||||
|
iv_weight_class TYPE i
|
||||||
|
iv_axles TYPE i
|
||||||
|
RETURNING VALUE(rv_fee) TYPE decfloat34
|
||||||
|
RAISING cx_abap_invalid_value.
|
||||||
|
|
||||||
|
# 5. Business rules
|
||||||
|
|
||||||
|
1. The distance is the length of the trip in kilometres. A distance below 0
|
||||||
|
is invalid input.
|
||||||
|
2. The weight class is 1, 2, 3, or 4. Every other value is invalid input.
|
||||||
|
3. The number of axles is 2, 3, 4, or 5. Every other value is invalid input.
|
||||||
|
4. Invalid input raises the exception INVALID_INPUT in {{P}}TOLL_FEE and the
|
||||||
|
exception CX_ABAP_INVALID_VALUE in {{P}}TOLL_CALC. {{P}}TOLL_FEE does not
|
||||||
|
set the fee in this case.
|
||||||
|
5. The base rate per kilometre depends on the weight class:
|
||||||
|
- Weight class 1: 0.10
|
||||||
|
- Weight class 2: 0.14
|
||||||
|
- Weight class 3: 0.18
|
||||||
|
- Weight class 4: 0.22
|
||||||
|
6. The number of axles adds a surcharge to the base amount:
|
||||||
|
- 2 axles: 0 %
|
||||||
|
- 3 axles: 5 %
|
||||||
|
- 4 axles: 10 %
|
||||||
|
- 5 axles: 15 %
|
||||||
|
7. The base amount is the distance multiplied by the base rate. The fee is the
|
||||||
|
base amount increased by the surcharge percentage. Round the fee half up to
|
||||||
|
2 decimals.
|
||||||
|
8. The minimum fee is 1.00. If the fee from rule 7 is below 1.00, the fee is
|
||||||
|
1.00.
|
||||||
|
9. {{P}}TOLL_FEE returns the fee that {{P}}TOLL_CALC calculates.
|
||||||
|
|
||||||
|
# 6. Constraints
|
||||||
|
|
||||||
|
- Release target: 7.58.
|
||||||
|
- The calculation is pure logic. It reads no database table and no other
|
||||||
|
external data.
|
||||||
|
- Out of scope: the trip log program and every object that is not in the
|
||||||
|
contract.
|
||||||
|
|
||||||
|
# 7. Acceptance
|
||||||
|
|
||||||
|
- {{P}}TOLL_FEE and {{P}}TOLL_CALC are active and have no syntax error.
|
||||||
|
- The hidden tests pass.
|
||||||
|
- Write ABAP Unit tests. Put local test classes in {{P}}TOLL_CALC. Write a
|
||||||
|
global test class for {{P}}TOLL_FEE.
|
||||||
82
tasks_gen/eval/G0105/task.json
Normal file
82
tasks_gen/eval/G0105/task.json
Normal file
@@ -0,0 +1,82 @@
|
|||||||
|
{
|
||||||
|
"id": "G0105",
|
||||||
|
"category": "A",
|
||||||
|
"object_type": "FUNC",
|
||||||
|
"difficulty": 2,
|
||||||
|
"release_target": "v758",
|
||||||
|
"expected_outcome": "implement",
|
||||||
|
"budget": {
|
||||||
|
"max_tool_calls": 40,
|
||||||
|
"max_activations": 10
|
||||||
|
},
|
||||||
|
"seed": [
|
||||||
|
{
|
||||||
|
"type": "FUGR",
|
||||||
|
"name": "{{P}}FG_TOLL",
|
||||||
|
"description": "Toll fee function group"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"contract": [
|
||||||
|
{
|
||||||
|
"type": "FUNC",
|
||||||
|
"name": "{{P}}TOLL_FEE",
|
||||||
|
"functionGroup": "{{P}}FG_TOLL",
|
||||||
|
"params": [
|
||||||
|
{
|
||||||
|
"name": "iv_distance_km",
|
||||||
|
"type": "decfloat34"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "iv_weight_class",
|
||||||
|
"type": "i"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "iv_axles",
|
||||||
|
"type": "i"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "ev_fee",
|
||||||
|
"type": "decfloat34"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"type": "CLAS",
|
||||||
|
"name": "{{P}}TOLL_CALC"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"out_of_scope": [],
|
||||||
|
"hidden_tests": [
|
||||||
|
{
|
||||||
|
"type": "CLAS",
|
||||||
|
"name": "{{P}}T14_HIDDEN",
|
||||||
|
"file": "hidden/t14_hidden.clas.abap",
|
||||||
|
"description": "T14 hidden tests"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"reference": [
|
||||||
|
{
|
||||||
|
"type": "CLAS",
|
||||||
|
"name": "{{P}}TOLL_CALC",
|
||||||
|
"file": "reference/toll_calc.clas.abap",
|
||||||
|
"testclasses_file": "reference/toll_calc.testclasses.abap",
|
||||||
|
"description": "Toll fee calculation"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"type": "FUNC",
|
||||||
|
"name": "{{P}}TOLL_FEE",
|
||||||
|
"functionGroup": "{{P}}FG_TOLL",
|
||||||
|
"file": "reference/toll_fee.func.abap",
|
||||||
|
"description": "Toll fee function module"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"type": "CLAS",
|
||||||
|
"name": "{{P}}T14_TEST",
|
||||||
|
"file": "reference/t14_test.clas.abap",
|
||||||
|
"description": "T14 own tests"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"craft_checks": [
|
||||||
|
"method_length"
|
||||||
|
]
|
||||||
|
}
|
||||||
102
tasks_gen/eval/G0106/faulty/m0_app_scorer.clas.abap
Normal file
102
tasks_gen/eval/G0106/faulty/m0_app_scorer.clas.abap
Normal file
@@ -0,0 +1,102 @@
|
|||||||
|
CLASS {{p}}app_scorer DEFINITION PUBLIC FINAL CREATE PUBLIC.
|
||||||
|
PUBLIC SECTION.
|
||||||
|
TYPES ty_status TYPE c LENGTH 4.
|
||||||
|
|
||||||
|
TYPES: BEGIN OF ty_result,
|
||||||
|
status TYPE ty_status,
|
||||||
|
score TYPE i,
|
||||||
|
rating TYPE string,
|
||||||
|
END OF ty_result.
|
||||||
|
|
||||||
|
CONSTANTS: BEGIN OF co_status,
|
||||||
|
ok TYPE ty_status VALUE 'OK',
|
||||||
|
bad_years TYPE ty_status VALUE 'YEAR',
|
||||||
|
bad_match TYPE ty_status VALUE 'MATC',
|
||||||
|
bad_degree TYPE ty_status VALUE 'DEGR',
|
||||||
|
END OF co_status.
|
||||||
|
|
||||||
|
METHODS evaluate
|
||||||
|
IMPORTING
|
||||||
|
iv_years TYPE i
|
||||||
|
iv_degree TYPE string
|
||||||
|
iv_match TYPE i
|
||||||
|
RETURNING
|
||||||
|
VALUE(rs_result) TYPE ty_result.
|
||||||
|
|
||||||
|
PRIVATE SECTION.
|
||||||
|
METHODS experience_points
|
||||||
|
IMPORTING iv_years TYPE i
|
||||||
|
RETURNING VALUE(rv_points) TYPE i.
|
||||||
|
METHODS education_points
|
||||||
|
IMPORTING iv_degree TYPE string
|
||||||
|
RETURNING VALUE(rv_points) TYPE i.
|
||||||
|
METHODS skill_points
|
||||||
|
IMPORTING iv_match TYPE i
|
||||||
|
RETURNING VALUE(rv_points) TYPE i.
|
||||||
|
METHODS rating_for
|
||||||
|
IMPORTING iv_score TYPE i
|
||||||
|
RETURNING VALUE(rv_rating) TYPE string.
|
||||||
|
ENDCLASS.
|
||||||
|
|
||||||
|
|
||||||
|
CLASS {{p}}app_scorer IMPLEMENTATION.
|
||||||
|
|
||||||
|
METHOD evaluate.
|
||||||
|
rs_result = VALUE #( status = co_status-ok ).
|
||||||
|
|
||||||
|
IF iv_years < 0.
|
||||||
|
rs_result-status = co_status-bad_years.
|
||||||
|
RETURN.
|
||||||
|
ENDIF.
|
||||||
|
|
||||||
|
IF iv_match < 0 AND iv_match > 100.
|
||||||
|
rs_result-status = co_status-bad_match.
|
||||||
|
RETURN.
|
||||||
|
ENDIF.
|
||||||
|
|
||||||
|
DATA(lv_education) = education_points( iv_degree ).
|
||||||
|
IF lv_education < 0.
|
||||||
|
rs_result-status = co_status-bad_degree.
|
||||||
|
RETURN.
|
||||||
|
ENDIF.
|
||||||
|
|
||||||
|
rs_result-score = experience_points( iv_years ) + lv_education + skill_points( iv_match ).
|
||||||
|
rs_result-rating = rating_for( rs_result-score ).
|
||||||
|
ENDMETHOD.
|
||||||
|
|
||||||
|
METHOD experience_points.
|
||||||
|
rv_points = iv_years * 8.
|
||||||
|
IF rv_points > 40.
|
||||||
|
rv_points = 40.
|
||||||
|
ENDIF.
|
||||||
|
ENDMETHOD.
|
||||||
|
|
||||||
|
METHOD education_points.
|
||||||
|
CASE iv_degree.
|
||||||
|
WHEN 'PHD'.
|
||||||
|
rv_points = 30.
|
||||||
|
WHEN 'MAS'.
|
||||||
|
rv_points = 25.
|
||||||
|
WHEN 'BAC'.
|
||||||
|
rv_points = 20.
|
||||||
|
WHEN 'VOC'.
|
||||||
|
rv_points = 10.
|
||||||
|
WHEN OTHERS.
|
||||||
|
rv_points = -1.
|
||||||
|
ENDCASE.
|
||||||
|
ENDMETHOD.
|
||||||
|
|
||||||
|
METHOD skill_points.
|
||||||
|
rv_points = ( iv_match * 30 + 50 ) DIV 100.
|
||||||
|
ENDMETHOD.
|
||||||
|
|
||||||
|
METHOD rating_for.
|
||||||
|
IF iv_score >= 75.
|
||||||
|
rv_rating = 'INVITE'.
|
||||||
|
ELSEIF iv_score >= 50.
|
||||||
|
rv_rating = 'REVIEW'.
|
||||||
|
ELSE.
|
||||||
|
rv_rating = 'REJECT'.
|
||||||
|
ENDIF.
|
||||||
|
ENDMETHOD.
|
||||||
|
ENDCLASS.
|
||||||
31
tasks_gen/eval/G0106/faulty/m1_appl_score.func.abap
Normal file
31
tasks_gen/eval/G0106/faulty/m1_appl_score.func.abap
Normal file
@@ -0,0 +1,31 @@
|
|||||||
|
FUNCTION {{p}}appl_score
|
||||||
|
IMPORTING
|
||||||
|
iv_years TYPE i
|
||||||
|
iv_degree TYPE string
|
||||||
|
iv_match TYPE i
|
||||||
|
EXPORTING
|
||||||
|
ev_score TYPE i
|
||||||
|
ev_rating TYPE string
|
||||||
|
EXCEPTIONS
|
||||||
|
invalid_years
|
||||||
|
invalid_match
|
||||||
|
invalid_degree.
|
||||||
|
|
||||||
|
DATA(lo_scorer) = NEW {{p}}app_scorer( ).
|
||||||
|
DATA(ls_result) = lo_scorer->evaluate(
|
||||||
|
iv_years = iv_years
|
||||||
|
iv_degree = iv_degree
|
||||||
|
iv_match = iv_match ).
|
||||||
|
|
||||||
|
IF ls_result-status <> {{p}}app_scorer=>co_status-bad_years.
|
||||||
|
RAISE invalid_years.
|
||||||
|
ELSEIF ls_result-status = {{p}}app_scorer=>co_status-bad_match.
|
||||||
|
RAISE invalid_match.
|
||||||
|
ELSEIF ls_result-status = {{p}}app_scorer=>co_status-bad_degree.
|
||||||
|
RAISE invalid_degree.
|
||||||
|
ENDIF.
|
||||||
|
|
||||||
|
ev_score = ls_result-score.
|
||||||
|
ev_rating = ls_result-rating.
|
||||||
|
|
||||||
|
ENDFUNCTION.
|
||||||
102
tasks_gen/eval/G0106/faulty/m2_app_scorer.clas.abap
Normal file
102
tasks_gen/eval/G0106/faulty/m2_app_scorer.clas.abap
Normal file
@@ -0,0 +1,102 @@
|
|||||||
|
CLASS {{p}}app_scorer DEFINITION PUBLIC FINAL CREATE PUBLIC.
|
||||||
|
PUBLIC SECTION.
|
||||||
|
TYPES ty_status TYPE c LENGTH 4.
|
||||||
|
|
||||||
|
TYPES: BEGIN OF ty_result,
|
||||||
|
status TYPE ty_status,
|
||||||
|
score TYPE i,
|
||||||
|
rating TYPE string,
|
||||||
|
END OF ty_result.
|
||||||
|
|
||||||
|
CONSTANTS: BEGIN OF co_status,
|
||||||
|
ok TYPE ty_status VALUE 'OK',
|
||||||
|
bad_years TYPE ty_status VALUE 'YEAR',
|
||||||
|
bad_match TYPE ty_status VALUE 'MATC',
|
||||||
|
bad_degree TYPE ty_status VALUE 'DEGR',
|
||||||
|
END OF co_status.
|
||||||
|
|
||||||
|
METHODS evaluate
|
||||||
|
IMPORTING
|
||||||
|
iv_years TYPE i
|
||||||
|
iv_degree TYPE string
|
||||||
|
iv_match TYPE i
|
||||||
|
RETURNING
|
||||||
|
VALUE(rs_result) TYPE ty_result.
|
||||||
|
|
||||||
|
PRIVATE SECTION.
|
||||||
|
METHODS experience_points
|
||||||
|
IMPORTING iv_years TYPE i
|
||||||
|
RETURNING VALUE(rv_points) TYPE i.
|
||||||
|
METHODS education_points
|
||||||
|
IMPORTING iv_degree TYPE string
|
||||||
|
RETURNING VALUE(rv_points) TYPE i.
|
||||||
|
METHODS skill_points
|
||||||
|
IMPORTING iv_match TYPE i
|
||||||
|
RETURNING VALUE(rv_points) TYPE i.
|
||||||
|
METHODS rating_for
|
||||||
|
IMPORTING iv_score TYPE i
|
||||||
|
RETURNING VALUE(rv_rating) TYPE string.
|
||||||
|
ENDCLASS.
|
||||||
|
|
||||||
|
|
||||||
|
CLASS {{p}}app_scorer IMPLEMENTATION.
|
||||||
|
|
||||||
|
METHOD evaluate.
|
||||||
|
rs_result = VALUE #( status = co_status-ok ).
|
||||||
|
|
||||||
|
IF iv_years < 0.
|
||||||
|
rs_result-status = co_status-bad_years.
|
||||||
|
RETURN.
|
||||||
|
ENDIF.
|
||||||
|
|
||||||
|
IF iv_match < 0 OR iv_match <= 100.
|
||||||
|
rs_result-status = co_status-bad_match.
|
||||||
|
RETURN.
|
||||||
|
ENDIF.
|
||||||
|
|
||||||
|
DATA(lv_education) = education_points( iv_degree ).
|
||||||
|
IF lv_education < 0.
|
||||||
|
rs_result-status = co_status-bad_degree.
|
||||||
|
RETURN.
|
||||||
|
ENDIF.
|
||||||
|
|
||||||
|
rs_result-score = experience_points( iv_years ) + lv_education + skill_points( iv_match ).
|
||||||
|
rs_result-rating = rating_for( rs_result-score ).
|
||||||
|
ENDMETHOD.
|
||||||
|
|
||||||
|
METHOD experience_points.
|
||||||
|
rv_points = iv_years * 8.
|
||||||
|
IF rv_points > 40.
|
||||||
|
rv_points = 40.
|
||||||
|
ENDIF.
|
||||||
|
ENDMETHOD.
|
||||||
|
|
||||||
|
METHOD education_points.
|
||||||
|
CASE iv_degree.
|
||||||
|
WHEN 'PHD'.
|
||||||
|
rv_points = 30.
|
||||||
|
WHEN 'MAS'.
|
||||||
|
rv_points = 25.
|
||||||
|
WHEN 'BAC'.
|
||||||
|
rv_points = 20.
|
||||||
|
WHEN 'VOC'.
|
||||||
|
rv_points = 10.
|
||||||
|
WHEN OTHERS.
|
||||||
|
rv_points = -1.
|
||||||
|
ENDCASE.
|
||||||
|
ENDMETHOD.
|
||||||
|
|
||||||
|
METHOD skill_points.
|
||||||
|
rv_points = ( iv_match * 30 + 50 ) DIV 100.
|
||||||
|
ENDMETHOD.
|
||||||
|
|
||||||
|
METHOD rating_for.
|
||||||
|
IF iv_score >= 75.
|
||||||
|
rv_rating = 'INVITE'.
|
||||||
|
ELSEIF iv_score >= 50.
|
||||||
|
rv_rating = 'REVIEW'.
|
||||||
|
ELSE.
|
||||||
|
rv_rating = 'REJECT'.
|
||||||
|
ENDIF.
|
||||||
|
ENDMETHOD.
|
||||||
|
ENDCLASS.
|
||||||
31
tasks_gen/eval/G0106/faulty/m3_appl_score.func.abap
Normal file
31
tasks_gen/eval/G0106/faulty/m3_appl_score.func.abap
Normal file
@@ -0,0 +1,31 @@
|
|||||||
|
FUNCTION {{p}}appl_score
|
||||||
|
IMPORTING
|
||||||
|
iv_years TYPE i
|
||||||
|
iv_degree TYPE string
|
||||||
|
iv_match TYPE i
|
||||||
|
EXPORTING
|
||||||
|
ev_score TYPE i
|
||||||
|
ev_rating TYPE string
|
||||||
|
EXCEPTIONS
|
||||||
|
invalid_years
|
||||||
|
invalid_match
|
||||||
|
invalid_degree.
|
||||||
|
|
||||||
|
DATA(lo_scorer) = NEW {{p}}app_scorer( ).
|
||||||
|
DATA(ls_result) = lo_scorer->evaluate(
|
||||||
|
iv_years = iv_years
|
||||||
|
iv_degree = iv_degree
|
||||||
|
iv_match = iv_match ).
|
||||||
|
|
||||||
|
IF ls_result-status = {{p}}app_scorer=>co_status-bad_years.
|
||||||
|
RAISE invalid_years.
|
||||||
|
ELSEIF ls_result-status <> {{p}}app_scorer=>co_status-bad_match.
|
||||||
|
RAISE invalid_match.
|
||||||
|
ELSEIF ls_result-status = {{p}}app_scorer=>co_status-bad_degree.
|
||||||
|
RAISE invalid_degree.
|
||||||
|
ENDIF.
|
||||||
|
|
||||||
|
ev_score = ls_result-score.
|
||||||
|
ev_rating = ls_result-rating.
|
||||||
|
|
||||||
|
ENDFUNCTION.
|
||||||
102
tasks_gen/eval/G0106/faulty/m4_app_scorer.clas.abap
Normal file
102
tasks_gen/eval/G0106/faulty/m4_app_scorer.clas.abap
Normal file
@@ -0,0 +1,102 @@
|
|||||||
|
CLASS {{p}}app_scorer DEFINITION PUBLIC FINAL CREATE PUBLIC.
|
||||||
|
PUBLIC SECTION.
|
||||||
|
TYPES ty_status TYPE c LENGTH 4.
|
||||||
|
|
||||||
|
TYPES: BEGIN OF ty_result,
|
||||||
|
status TYPE ty_status,
|
||||||
|
score TYPE i,
|
||||||
|
rating TYPE string,
|
||||||
|
END OF ty_result.
|
||||||
|
|
||||||
|
CONSTANTS: BEGIN OF co_status,
|
||||||
|
ok TYPE ty_status VALUE 'OK',
|
||||||
|
bad_years TYPE ty_status VALUE 'YEAR',
|
||||||
|
bad_match TYPE ty_status VALUE 'MATC',
|
||||||
|
bad_degree TYPE ty_status VALUE 'DEGR',
|
||||||
|
END OF co_status.
|
||||||
|
|
||||||
|
METHODS evaluate
|
||||||
|
IMPORTING
|
||||||
|
iv_years TYPE i
|
||||||
|
iv_degree TYPE string
|
||||||
|
iv_match TYPE i
|
||||||
|
RETURNING
|
||||||
|
VALUE(rs_result) TYPE ty_result.
|
||||||
|
|
||||||
|
PRIVATE SECTION.
|
||||||
|
METHODS experience_points
|
||||||
|
IMPORTING iv_years TYPE i
|
||||||
|
RETURNING VALUE(rv_points) TYPE i.
|
||||||
|
METHODS education_points
|
||||||
|
IMPORTING iv_degree TYPE string
|
||||||
|
RETURNING VALUE(rv_points) TYPE i.
|
||||||
|
METHODS skill_points
|
||||||
|
IMPORTING iv_match TYPE i
|
||||||
|
RETURNING VALUE(rv_points) TYPE i.
|
||||||
|
METHODS rating_for
|
||||||
|
IMPORTING iv_score TYPE i
|
||||||
|
RETURNING VALUE(rv_rating) TYPE string.
|
||||||
|
ENDCLASS.
|
||||||
|
|
||||||
|
|
||||||
|
CLASS {{p}}app_scorer IMPLEMENTATION.
|
||||||
|
|
||||||
|
METHOD evaluate.
|
||||||
|
rs_result = VALUE #( status = co_status-ok ).
|
||||||
|
|
||||||
|
IF iv_years < 0.
|
||||||
|
rs_result-status = co_status-bad_years.
|
||||||
|
RETURN.
|
||||||
|
ENDIF.
|
||||||
|
|
||||||
|
IF iv_match < 0 OR iv_match > 100.
|
||||||
|
rs_result-status = co_status-bad_match.
|
||||||
|
RETURN.
|
||||||
|
ENDIF.
|
||||||
|
|
||||||
|
DATA(lv_education) = education_points( iv_degree ).
|
||||||
|
IF lv_education >= 0.
|
||||||
|
rs_result-status = co_status-bad_degree.
|
||||||
|
RETURN.
|
||||||
|
ENDIF.
|
||||||
|
|
||||||
|
rs_result-score = experience_points( iv_years ) + lv_education + skill_points( iv_match ).
|
||||||
|
rs_result-rating = rating_for( rs_result-score ).
|
||||||
|
ENDMETHOD.
|
||||||
|
|
||||||
|
METHOD experience_points.
|
||||||
|
rv_points = iv_years * 8.
|
||||||
|
IF rv_points > 40.
|
||||||
|
rv_points = 40.
|
||||||
|
ENDIF.
|
||||||
|
ENDMETHOD.
|
||||||
|
|
||||||
|
METHOD education_points.
|
||||||
|
CASE iv_degree.
|
||||||
|
WHEN 'PHD'.
|
||||||
|
rv_points = 30.
|
||||||
|
WHEN 'MAS'.
|
||||||
|
rv_points = 25.
|
||||||
|
WHEN 'BAC'.
|
||||||
|
rv_points = 20.
|
||||||
|
WHEN 'VOC'.
|
||||||
|
rv_points = 10.
|
||||||
|
WHEN OTHERS.
|
||||||
|
rv_points = -1.
|
||||||
|
ENDCASE.
|
||||||
|
ENDMETHOD.
|
||||||
|
|
||||||
|
METHOD skill_points.
|
||||||
|
rv_points = ( iv_match * 30 + 50 ) DIV 100.
|
||||||
|
ENDMETHOD.
|
||||||
|
|
||||||
|
METHOD rating_for.
|
||||||
|
IF iv_score >= 75.
|
||||||
|
rv_rating = 'INVITE'.
|
||||||
|
ELSEIF iv_score >= 50.
|
||||||
|
rv_rating = 'REVIEW'.
|
||||||
|
ELSE.
|
||||||
|
rv_rating = 'REJECT'.
|
||||||
|
ENDIF.
|
||||||
|
ENDMETHOD.
|
||||||
|
ENDCLASS.
|
||||||
19
tasks_gen/eval/G0106/generation.json
Normal file
19
tasks_gen/eval/G0106/generation.json
Normal file
@@ -0,0 +1,19 @@
|
|||||||
|
{
|
||||||
|
"id": "G0106",
|
||||||
|
"pool": "eval",
|
||||||
|
"object_type": "FUNC",
|
||||||
|
"category": "A",
|
||||||
|
"attempts": [
|
||||||
|
{
|
||||||
|
"stage": "validate",
|
||||||
|
"oracle": 100.0,
|
||||||
|
"null": 0,
|
||||||
|
"mutation": {
|
||||||
|
"valid": 5,
|
||||||
|
"killed": 5,
|
||||||
|
"ok": true
|
||||||
|
}
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"accepted": true
|
||||||
|
}
|
||||||
138
tasks_gen/eval/G0106/hidden/t41_hidden.clas.abap
Normal file
138
tasks_gen/eval/G0106/hidden/t41_hidden.clas.abap
Normal file
@@ -0,0 +1,138 @@
|
|||||||
|
CLASS {{p}}t41_hidden DEFINITION PUBLIC FINAL CREATE PUBLIC
|
||||||
|
FOR TESTING DURATION SHORT RISK LEVEL HARMLESS.
|
||||||
|
PRIVATE SECTION.
|
||||||
|
METHODS call_score
|
||||||
|
IMPORTING iv_years TYPE i iv_degree TYPE string iv_match TYPE i
|
||||||
|
EXPORTING ev_score TYPE i ev_rating TYPE string ev_subrc TYPE sysubrc.
|
||||||
|
METHODS class_experience_points FOR TESTING.
|
||||||
|
METHODS class_education_points FOR TESTING.
|
||||||
|
METHODS class_skill_rounding FOR TESTING.
|
||||||
|
METHODS class_rating_limits FOR TESTING.
|
||||||
|
METHODS class_invalid_years FOR TESTING.
|
||||||
|
METHODS class_invalid_match FOR TESTING.
|
||||||
|
METHODS class_invalid_degree FOR TESTING.
|
||||||
|
METHODS func_returns_result FOR TESTING.
|
||||||
|
METHODS func_raises_years FOR TESTING.
|
||||||
|
METHODS func_raises_match FOR TESTING.
|
||||||
|
METHODS func_raises_degree FOR TESTING.
|
||||||
|
ENDCLASS.
|
||||||
|
|
||||||
|
|
||||||
|
CLASS {{p}}t41_hidden IMPLEMENTATION.
|
||||||
|
|
||||||
|
METHOD call_score.
|
||||||
|
CLEAR: ev_score, ev_rating.
|
||||||
|
CALL FUNCTION '{{P}}APPL_SCORE'
|
||||||
|
EXPORTING
|
||||||
|
iv_years = iv_years
|
||||||
|
iv_degree = iv_degree
|
||||||
|
iv_match = iv_match
|
||||||
|
IMPORTING
|
||||||
|
ev_score = ev_score
|
||||||
|
ev_rating = ev_rating
|
||||||
|
EXCEPTIONS
|
||||||
|
invalid_years = 1
|
||||||
|
invalid_match = 2
|
||||||
|
invalid_degree = 3
|
||||||
|
OTHERS = 4.
|
||||||
|
ev_subrc = sy-subrc.
|
||||||
|
ENDMETHOD.
|
||||||
|
|
||||||
|
METHOD class_experience_points.
|
||||||
|
DATA(lo_scorer) = NEW {{p}}app_scorer( ).
|
||||||
|
DATA(ls_two) = lo_scorer->evaluate( iv_years = 2 iv_degree = 'VOC' iv_match = 0 ).
|
||||||
|
cl_abap_unit_assert=>assert_equals( exp = 26 act = ls_two-score ).
|
||||||
|
DATA(ls_cap) = lo_scorer->evaluate( iv_years = 9 iv_degree = 'VOC' iv_match = 0 ).
|
||||||
|
cl_abap_unit_assert=>assert_equals( exp = 50 act = ls_cap-score ).
|
||||||
|
ENDMETHOD.
|
||||||
|
|
||||||
|
METHOD class_education_points.
|
||||||
|
DATA(lo_scorer) = NEW {{p}}app_scorer( ).
|
||||||
|
DATA(ls_phd) = lo_scorer->evaluate( iv_years = 0 iv_degree = 'PHD' iv_match = 0 ).
|
||||||
|
cl_abap_unit_assert=>assert_equals( exp = 30 act = ls_phd-score ).
|
||||||
|
DATA(ls_mas) = lo_scorer->evaluate( iv_years = 0 iv_degree = 'MAS' iv_match = 0 ).
|
||||||
|
cl_abap_unit_assert=>assert_equals( exp = 25 act = ls_mas-score ).
|
||||||
|
DATA(ls_bac) = lo_scorer->evaluate( iv_years = 0 iv_degree = 'BAC' iv_match = 0 ).
|
||||||
|
cl_abap_unit_assert=>assert_equals( exp = 20 act = ls_bac-score ).
|
||||||
|
DATA(ls_voc) = lo_scorer->evaluate( iv_years = 0 iv_degree = 'VOC' iv_match = 0 ).
|
||||||
|
cl_abap_unit_assert=>assert_equals( exp = 10 act = ls_voc-score ).
|
||||||
|
ENDMETHOD.
|
||||||
|
|
||||||
|
METHOD class_skill_rounding.
|
||||||
|
DATA(lo_scorer) = NEW {{p}}app_scorer( ).
|
||||||
|
DATA(ls_full) = lo_scorer->evaluate( iv_years = 0 iv_degree = 'VOC' iv_match = 100 ).
|
||||||
|
cl_abap_unit_assert=>assert_equals( exp = 40 act = ls_full-score ).
|
||||||
|
DATA(ls_half) = lo_scorer->evaluate( iv_years = 0 iv_degree = 'VOC' iv_match = 35 ).
|
||||||
|
cl_abap_unit_assert=>assert_equals( exp = 21 act = ls_half-score ).
|
||||||
|
DATA(ls_down) = lo_scorer->evaluate( iv_years = 0 iv_degree = 'VOC' iv_match = 33 ).
|
||||||
|
cl_abap_unit_assert=>assert_equals( exp = 20 act = ls_down-score ).
|
||||||
|
DATA(ls_low) = lo_scorer->evaluate( iv_years = 0 iv_degree = 'VOC' iv_match = 1 ).
|
||||||
|
cl_abap_unit_assert=>assert_equals( exp = 10 act = ls_low-score ).
|
||||||
|
ENDMETHOD.
|
||||||
|
|
||||||
|
METHOD class_rating_limits.
|
||||||
|
DATA(lo_scorer) = NEW {{p}}app_scorer( ).
|
||||||
|
DATA(ls_invite) = lo_scorer->evaluate( iv_years = 5 iv_degree = 'MAS' iv_match = 33 ).
|
||||||
|
cl_abap_unit_assert=>assert_equals( exp = 75 act = ls_invite-score ).
|
||||||
|
cl_abap_unit_assert=>assert_equals( exp = 'INVITE' act = ls_invite-rating ).
|
||||||
|
DATA(ls_review) = lo_scorer->evaluate( iv_years = 5 iv_degree = 'MAS' iv_match = 30 ).
|
||||||
|
cl_abap_unit_assert=>assert_equals( exp = 74 act = ls_review-score ).
|
||||||
|
cl_abap_unit_assert=>assert_equals( exp = 'REVIEW' act = ls_review-rating ).
|
||||||
|
DATA(ls_edge) = lo_scorer->evaluate( iv_years = 5 iv_degree = 'VOC' iv_match = 0 ).
|
||||||
|
cl_abap_unit_assert=>assert_equals( exp = 50 act = ls_edge-score ).
|
||||||
|
cl_abap_unit_assert=>assert_equals( exp = 'REVIEW' act = ls_edge-rating ).
|
||||||
|
DATA(ls_low) = lo_scorer->evaluate( iv_years = 3 iv_degree = 'MAS' iv_match = 0 ).
|
||||||
|
cl_abap_unit_assert=>assert_equals( exp = 49 act = ls_low-score ).
|
||||||
|
cl_abap_unit_assert=>assert_equals( exp = 'REJECT' act = ls_low-rating ).
|
||||||
|
ENDMETHOD.
|
||||||
|
|
||||||
|
METHOD class_invalid_years.
|
||||||
|
DATA(lo_scorer) = NEW {{p}}app_scorer( ).
|
||||||
|
DATA(ls_result) = lo_scorer->evaluate( iv_years = -1 iv_degree = 'PHD' iv_match = 100 ).
|
||||||
|
cl_abap_unit_assert=>assert_equals( exp = 'YEAR' act = ls_result-status ).
|
||||||
|
cl_abap_unit_assert=>assert_equals( exp = 0 act = ls_result-score ).
|
||||||
|
cl_abap_unit_assert=>assert_initial( act = ls_result-rating ).
|
||||||
|
ENDMETHOD.
|
||||||
|
|
||||||
|
METHOD class_invalid_match.
|
||||||
|
DATA(lo_scorer) = NEW {{p}}app_scorer( ).
|
||||||
|
DATA(ls_high) = lo_scorer->evaluate( iv_years = 1 iv_degree = 'PHD' iv_match = 101 ).
|
||||||
|
cl_abap_unit_assert=>assert_equals( exp = 'MATC' act = ls_high-status ).
|
||||||
|
DATA(ls_low) = lo_scorer->evaluate( iv_years = 1 iv_degree = 'PHD' iv_match = -1 ).
|
||||||
|
cl_abap_unit_assert=>assert_equals( exp = 'MATC' act = ls_low-status ).
|
||||||
|
cl_abap_unit_assert=>assert_equals( exp = 0 act = ls_low-score ).
|
||||||
|
ENDMETHOD.
|
||||||
|
|
||||||
|
METHOD class_invalid_degree.
|
||||||
|
DATA(lo_scorer) = NEW {{p}}app_scorer( ).
|
||||||
|
DATA(ls_result) = lo_scorer->evaluate( iv_years = 1 iv_degree = 'XYZ' iv_match = 50 ).
|
||||||
|
cl_abap_unit_assert=>assert_equals( exp = 'DEGR' act = ls_result-status ).
|
||||||
|
cl_abap_unit_assert=>assert_initial( act = ls_result-rating ).
|
||||||
|
ENDMETHOD.
|
||||||
|
|
||||||
|
METHOD func_returns_result.
|
||||||
|
call_score( EXPORTING iv_years = 5 iv_degree = 'PHD' iv_match = 100
|
||||||
|
IMPORTING ev_score = DATA(lv_score) ev_rating = DATA(lv_rating) ev_subrc = DATA(lv_rc) ).
|
||||||
|
cl_abap_unit_assert=>assert_equals( exp = 0 act = lv_rc ).
|
||||||
|
cl_abap_unit_assert=>assert_equals( exp = 100 act = lv_score ).
|
||||||
|
cl_abap_unit_assert=>assert_equals( exp = 'INVITE' act = lv_rating ).
|
||||||
|
ENDMETHOD.
|
||||||
|
|
||||||
|
METHOD func_raises_years.
|
||||||
|
call_score( EXPORTING iv_years = -3 iv_degree = 'PHD' iv_match = 100
|
||||||
|
IMPORTING ev_subrc = DATA(lv_rc) ).
|
||||||
|
cl_abap_unit_assert=>assert_equals( exp = 1 act = lv_rc ).
|
||||||
|
ENDMETHOD.
|
||||||
|
|
||||||
|
METHOD func_raises_match.
|
||||||
|
call_score( EXPORTING iv_years = 5 iv_degree = 'PHD' iv_match = 200
|
||||||
|
IMPORTING ev_subrc = DATA(lv_rc) ).
|
||||||
|
cl_abap_unit_assert=>assert_equals( exp = 2 act = lv_rc ).
|
||||||
|
ENDMETHOD.
|
||||||
|
|
||||||
|
METHOD func_raises_degree.
|
||||||
|
call_score( EXPORTING iv_years = 5 iv_degree = 'ABC' iv_match = 100
|
||||||
|
IMPORTING ev_subrc = DATA(lv_rc) ).
|
||||||
|
cl_abap_unit_assert=>assert_equals( exp = 3 act = lv_rc ).
|
||||||
|
ENDMETHOD.
|
||||||
|
ENDCLASS.
|
||||||
74
tasks_gen/eval/G0106/mutation.json
Normal file
74
tasks_gen/eval/G0106/mutation.json
Normal file
@@ -0,0 +1,74 @@
|
|||||||
|
{
|
||||||
|
"task": "G0106",
|
||||||
|
"mutants": [
|
||||||
|
{
|
||||||
|
"object": "{{P}}APP_SCORER",
|
||||||
|
"mutant": "line 52: OR -> AND (logic)",
|
||||||
|
"status": "killed",
|
||||||
|
"hidden": "9/11",
|
||||||
|
"failed_tests": [
|
||||||
|
"CLASS_INVALID_MATCH",
|
||||||
|
"FUNC_RAISES_MATCH"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"object": "{{P}}APPL_SCORE",
|
||||||
|
"mutant": "line 20: = -> <> (eq)",
|
||||||
|
"status": "killed",
|
||||||
|
"hidden": "7/11",
|
||||||
|
"failed_tests": [
|
||||||
|
"FUNC_RAISES_DEGREE",
|
||||||
|
"FUNC_RAISES_MATCH",
|
||||||
|
"FUNC_RAISES_YEARS",
|
||||||
|
"FUNC_RETURNS_RESULT"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"object": "{{P}}APP_SCORER",
|
||||||
|
"mutant": "line 52: > -> <= (rel)",
|
||||||
|
"status": "killed",
|
||||||
|
"hidden": "2/11",
|
||||||
|
"failed_tests": [
|
||||||
|
"CLASS_EDUCATION_POINTS",
|
||||||
|
"CLASS_EXPERIENCE_POINTS",
|
||||||
|
"CLASS_INVALID_DEGREE",
|
||||||
|
"CLASS_INVALID_MATCH",
|
||||||
|
"CLASS_RATING_LIMITS",
|
||||||
|
"CLASS_SKILL_ROUNDING",
|
||||||
|
"FUNC_RAISES_DEGREE",
|
||||||
|
"FUNC_RAISES_MATCH",
|
||||||
|
"FUNC_RETURNS_RESULT"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"object": "{{P}}APPL_SCORE",
|
||||||
|
"mutant": "line 22: = -> <> (eq)",
|
||||||
|
"status": "killed",
|
||||||
|
"hidden": "8/11",
|
||||||
|
"failed_tests": [
|
||||||
|
"FUNC_RAISES_DEGREE",
|
||||||
|
"FUNC_RAISES_MATCH",
|
||||||
|
"FUNC_RETURNS_RESULT"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"object": "{{P}}APP_SCORER",
|
||||||
|
"mutant": "line 58: < -> >= (rel)",
|
||||||
|
"status": "killed",
|
||||||
|
"hidden": "4/11",
|
||||||
|
"failed_tests": [
|
||||||
|
"CLASS_EDUCATION_POINTS",
|
||||||
|
"CLASS_EXPERIENCE_POINTS",
|
||||||
|
"CLASS_INVALID_DEGREE",
|
||||||
|
"CLASS_RATING_LIMITS",
|
||||||
|
"CLASS_SKILL_ROUNDING",
|
||||||
|
"FUNC_RAISES_DEGREE",
|
||||||
|
"FUNC_RETURNS_RESULT"
|
||||||
|
]
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"valid": 5,
|
||||||
|
"killed": 5,
|
||||||
|
"kill_rate": 1.0,
|
||||||
|
"ok": true
|
||||||
|
}
|
||||||
102
tasks_gen/eval/G0106/reference/app_scorer.clas.abap
Normal file
102
tasks_gen/eval/G0106/reference/app_scorer.clas.abap
Normal file
@@ -0,0 +1,102 @@
|
|||||||
|
CLASS {{p}}app_scorer DEFINITION PUBLIC FINAL CREATE PUBLIC.
|
||||||
|
PUBLIC SECTION.
|
||||||
|
TYPES ty_status TYPE c LENGTH 4.
|
||||||
|
|
||||||
|
TYPES: BEGIN OF ty_result,
|
||||||
|
status TYPE ty_status,
|
||||||
|
score TYPE i,
|
||||||
|
rating TYPE string,
|
||||||
|
END OF ty_result.
|
||||||
|
|
||||||
|
CONSTANTS: BEGIN OF co_status,
|
||||||
|
ok TYPE ty_status VALUE 'OK',
|
||||||
|
bad_years TYPE ty_status VALUE 'YEAR',
|
||||||
|
bad_match TYPE ty_status VALUE 'MATC',
|
||||||
|
bad_degree TYPE ty_status VALUE 'DEGR',
|
||||||
|
END OF co_status.
|
||||||
|
|
||||||
|
METHODS evaluate
|
||||||
|
IMPORTING
|
||||||
|
iv_years TYPE i
|
||||||
|
iv_degree TYPE string
|
||||||
|
iv_match TYPE i
|
||||||
|
RETURNING
|
||||||
|
VALUE(rs_result) TYPE ty_result.
|
||||||
|
|
||||||
|
PRIVATE SECTION.
|
||||||
|
METHODS experience_points
|
||||||
|
IMPORTING iv_years TYPE i
|
||||||
|
RETURNING VALUE(rv_points) TYPE i.
|
||||||
|
METHODS education_points
|
||||||
|
IMPORTING iv_degree TYPE string
|
||||||
|
RETURNING VALUE(rv_points) TYPE i.
|
||||||
|
METHODS skill_points
|
||||||
|
IMPORTING iv_match TYPE i
|
||||||
|
RETURNING VALUE(rv_points) TYPE i.
|
||||||
|
METHODS rating_for
|
||||||
|
IMPORTING iv_score TYPE i
|
||||||
|
RETURNING VALUE(rv_rating) TYPE string.
|
||||||
|
ENDCLASS.
|
||||||
|
|
||||||
|
|
||||||
|
CLASS {{p}}app_scorer IMPLEMENTATION.
|
||||||
|
|
||||||
|
METHOD evaluate.
|
||||||
|
rs_result = VALUE #( status = co_status-ok ).
|
||||||
|
|
||||||
|
IF iv_years < 0.
|
||||||
|
rs_result-status = co_status-bad_years.
|
||||||
|
RETURN.
|
||||||
|
ENDIF.
|
||||||
|
|
||||||
|
IF iv_match < 0 OR iv_match > 100.
|
||||||
|
rs_result-status = co_status-bad_match.
|
||||||
|
RETURN.
|
||||||
|
ENDIF.
|
||||||
|
|
||||||
|
DATA(lv_education) = education_points( iv_degree ).
|
||||||
|
IF lv_education < 0.
|
||||||
|
rs_result-status = co_status-bad_degree.
|
||||||
|
RETURN.
|
||||||
|
ENDIF.
|
||||||
|
|
||||||
|
rs_result-score = experience_points( iv_years ) + lv_education + skill_points( iv_match ).
|
||||||
|
rs_result-rating = rating_for( rs_result-score ).
|
||||||
|
ENDMETHOD.
|
||||||
|
|
||||||
|
METHOD experience_points.
|
||||||
|
rv_points = iv_years * 8.
|
||||||
|
IF rv_points > 40.
|
||||||
|
rv_points = 40.
|
||||||
|
ENDIF.
|
||||||
|
ENDMETHOD.
|
||||||
|
|
||||||
|
METHOD education_points.
|
||||||
|
CASE iv_degree.
|
||||||
|
WHEN 'PHD'.
|
||||||
|
rv_points = 30.
|
||||||
|
WHEN 'MAS'.
|
||||||
|
rv_points = 25.
|
||||||
|
WHEN 'BAC'.
|
||||||
|
rv_points = 20.
|
||||||
|
WHEN 'VOC'.
|
||||||
|
rv_points = 10.
|
||||||
|
WHEN OTHERS.
|
||||||
|
rv_points = -1.
|
||||||
|
ENDCASE.
|
||||||
|
ENDMETHOD.
|
||||||
|
|
||||||
|
METHOD skill_points.
|
||||||
|
rv_points = ( iv_match * 30 + 50 ) DIV 100.
|
||||||
|
ENDMETHOD.
|
||||||
|
|
||||||
|
METHOD rating_for.
|
||||||
|
IF iv_score >= 75.
|
||||||
|
rv_rating = 'INVITE'.
|
||||||
|
ELSEIF iv_score >= 50.
|
||||||
|
rv_rating = 'REVIEW'.
|
||||||
|
ELSE.
|
||||||
|
rv_rating = 'REJECT'.
|
||||||
|
ENDIF.
|
||||||
|
ENDMETHOD.
|
||||||
|
ENDCLASS.
|
||||||
@@ -0,0 +1,33 @@
|
|||||||
|
CLASS ltc_scorer DEFINITION FOR TESTING
|
||||||
|
DURATION SHORT RISK LEVEL HARMLESS.
|
||||||
|
PRIVATE SECTION.
|
||||||
|
METHODS high_score FOR TESTING.
|
||||||
|
METHODS low_score FOR TESTING.
|
||||||
|
METHODS invalid_years FOR TESTING.
|
||||||
|
ENDCLASS.
|
||||||
|
|
||||||
|
|
||||||
|
CLASS ltc_scorer IMPLEMENTATION.
|
||||||
|
|
||||||
|
METHOD high_score.
|
||||||
|
DATA(lo_scorer) = NEW {{p}}app_scorer( ).
|
||||||
|
DATA(ls_result) = lo_scorer->evaluate( iv_years = 5 iv_degree = 'PHD' iv_match = 100 ).
|
||||||
|
cl_abap_unit_assert=>assert_equals( exp = 'OK' act = ls_result-status ).
|
||||||
|
cl_abap_unit_assert=>assert_equals( exp = 100 act = ls_result-score ).
|
||||||
|
cl_abap_unit_assert=>assert_equals( exp = 'INVITE' act = ls_result-rating ).
|
||||||
|
ENDMETHOD.
|
||||||
|
|
||||||
|
METHOD low_score.
|
||||||
|
DATA(lo_scorer) = NEW {{p}}app_scorer( ).
|
||||||
|
DATA(ls_result) = lo_scorer->evaluate( iv_years = 0 iv_degree = 'VOC' iv_match = 0 ).
|
||||||
|
cl_abap_unit_assert=>assert_equals( exp = 10 act = ls_result-score ).
|
||||||
|
cl_abap_unit_assert=>assert_equals( exp = 'REJECT' act = ls_result-rating ).
|
||||||
|
ENDMETHOD.
|
||||||
|
|
||||||
|
METHOD invalid_years.
|
||||||
|
DATA(lo_scorer) = NEW {{p}}app_scorer( ).
|
||||||
|
DATA(ls_result) = lo_scorer->evaluate( iv_years = -1 iv_degree = 'PHD' iv_match = 100 ).
|
||||||
|
cl_abap_unit_assert=>assert_equals( exp = 'YEAR' act = ls_result-status ).
|
||||||
|
cl_abap_unit_assert=>assert_initial( act = ls_result-rating ).
|
||||||
|
ENDMETHOD.
|
||||||
|
ENDCLASS.
|
||||||
31
tasks_gen/eval/G0106/reference/appl_score.func.abap
Normal file
31
tasks_gen/eval/G0106/reference/appl_score.func.abap
Normal file
@@ -0,0 +1,31 @@
|
|||||||
|
FUNCTION {{p}}appl_score
|
||||||
|
IMPORTING
|
||||||
|
iv_years TYPE i
|
||||||
|
iv_degree TYPE string
|
||||||
|
iv_match TYPE i
|
||||||
|
EXPORTING
|
||||||
|
ev_score TYPE i
|
||||||
|
ev_rating TYPE string
|
||||||
|
EXCEPTIONS
|
||||||
|
invalid_years
|
||||||
|
invalid_match
|
||||||
|
invalid_degree.
|
||||||
|
|
||||||
|
DATA(lo_scorer) = NEW {{p}}app_scorer( ).
|
||||||
|
DATA(ls_result) = lo_scorer->evaluate(
|
||||||
|
iv_years = iv_years
|
||||||
|
iv_degree = iv_degree
|
||||||
|
iv_match = iv_match ).
|
||||||
|
|
||||||
|
IF ls_result-status = {{p}}app_scorer=>co_status-bad_years.
|
||||||
|
RAISE invalid_years.
|
||||||
|
ELSEIF ls_result-status = {{p}}app_scorer=>co_status-bad_match.
|
||||||
|
RAISE invalid_match.
|
||||||
|
ELSEIF ls_result-status = {{p}}app_scorer=>co_status-bad_degree.
|
||||||
|
RAISE invalid_degree.
|
||||||
|
ENDIF.
|
||||||
|
|
||||||
|
ev_score = ls_result-score.
|
||||||
|
ev_rating = ls_result-rating.
|
||||||
|
|
||||||
|
ENDFUNCTION.
|
||||||
61
tasks_gen/eval/G0106/reference/t41_test.clas.abap
Normal file
61
tasks_gen/eval/G0106/reference/t41_test.clas.abap
Normal file
@@ -0,0 +1,61 @@
|
|||||||
|
CLASS {{p}}t41_test DEFINITION PUBLIC FINAL CREATE PUBLIC
|
||||||
|
FOR TESTING DURATION SHORT RISK LEVEL HARMLESS.
|
||||||
|
PRIVATE SECTION.
|
||||||
|
METHODS score_of
|
||||||
|
IMPORTING iv_years TYPE i iv_degree TYPE string iv_match TYPE i
|
||||||
|
RETURNING VALUE(rv_score) TYPE i.
|
||||||
|
METHODS invite_for_expert FOR TESTING.
|
||||||
|
METHODS review_for_graduate FOR TESTING.
|
||||||
|
METHODS reject_for_junior FOR TESTING.
|
||||||
|
METHODS invalid_input FOR TESTING.
|
||||||
|
ENDCLASS.
|
||||||
|
|
||||||
|
|
||||||
|
CLASS {{p}}t41_test IMPLEMENTATION.
|
||||||
|
|
||||||
|
METHOD score_of.
|
||||||
|
CALL FUNCTION '{{P}}APPL_SCORE'
|
||||||
|
EXPORTING
|
||||||
|
iv_years = iv_years
|
||||||
|
iv_degree = iv_degree
|
||||||
|
iv_match = iv_match
|
||||||
|
IMPORTING
|
||||||
|
ev_score = rv_score
|
||||||
|
EXCEPTIONS
|
||||||
|
invalid_years = 1
|
||||||
|
invalid_match = 2
|
||||||
|
invalid_degree = 3
|
||||||
|
OTHERS = 4.
|
||||||
|
cl_abap_unit_assert=>assert_subrc( exp = 0 ).
|
||||||
|
ENDMETHOD.
|
||||||
|
|
||||||
|
METHOD invite_for_expert.
|
||||||
|
cl_abap_unit_assert=>assert_equals(
|
||||||
|
exp = 100
|
||||||
|
act = score_of( iv_years = 5 iv_degree = 'PHD' iv_match = 100 ) ).
|
||||||
|
ENDMETHOD.
|
||||||
|
|
||||||
|
METHOD review_for_graduate.
|
||||||
|
cl_abap_unit_assert=>assert_equals(
|
||||||
|
exp = 50
|
||||||
|
act = score_of( iv_years = 5 iv_degree = 'VOC' iv_match = 0 ) ).
|
||||||
|
ENDMETHOD.
|
||||||
|
|
||||||
|
METHOD reject_for_junior.
|
||||||
|
cl_abap_unit_assert=>assert_equals(
|
||||||
|
exp = 18
|
||||||
|
act = score_of( iv_years = 1 iv_degree = 'VOC' iv_match = 0 ) ).
|
||||||
|
ENDMETHOD.
|
||||||
|
|
||||||
|
METHOD invalid_input.
|
||||||
|
CALL FUNCTION '{{P}}APPL_SCORE'
|
||||||
|
EXPORTING
|
||||||
|
iv_years = -1
|
||||||
|
iv_degree = 'PHD'
|
||||||
|
iv_match = 50
|
||||||
|
EXCEPTIONS
|
||||||
|
invalid_years = 1
|
||||||
|
OTHERS = 2.
|
||||||
|
cl_abap_unit_assert=>assert_equals( exp = 1 act = sy-subrc ).
|
||||||
|
ENDMETHOD.
|
||||||
|
ENDCLASS.
|
||||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user