Stage 2 summary at 50 accepted trajectories
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
This commit is contained in:
137
tasks_gen/train/G1082/faulty/m0_climb_pricer.clas.abap
Normal file
137
tasks_gen/train/G1082/faulty/m0_climb_pricer.clas.abap
Normal file
@@ -0,0 +1,137 @@
|
||||
CLASS {{p}}climb_pricer DEFINITION PUBLIC FINAL CREATE PUBLIC.
|
||||
PUBLIC SECTION.
|
||||
TYPES ty_entry TYPE c LENGTH 1.
|
||||
TYPES ty_amount TYPE p LENGTH 8 DECIMALS 2.
|
||||
TYPES:
|
||||
BEGIN OF ty_session,
|
||||
entry_type TYPE ty_entry,
|
||||
hours TYPE i,
|
||||
climbers TYPE i,
|
||||
equipment TYPE abap_bool,
|
||||
member TYPE abap_bool,
|
||||
visits TYPE i,
|
||||
END OF ty_session.
|
||||
TYPES:
|
||||
BEGIN OF ty_result,
|
||||
base TYPE ty_amount,
|
||||
surcharge TYPE ty_amount,
|
||||
discount TYPE ty_amount,
|
||||
total TYPE ty_amount,
|
||||
message TYPE string,
|
||||
END OF ty_result.
|
||||
METHODS price
|
||||
IMPORTING is_session TYPE ty_session
|
||||
RETURNING VALUE(rs_result) TYPE ty_result.
|
||||
|
||||
PRIVATE SECTION.
|
||||
CONSTANTS:
|
||||
BEGIN OF c_entry,
|
||||
adult TYPE ty_entry VALUE 'A',
|
||||
youth TYPE ty_entry VALUE 'Y',
|
||||
family TYPE ty_entry VALUE 'F',
|
||||
END OF c_entry.
|
||||
CONSTANTS:
|
||||
BEGIN OF c_message,
|
||||
unknown_entry TYPE string VALUE 'UNKNOWN ENTRY TYPE',
|
||||
invalid_hours TYPE string VALUE 'INVALID HOURS',
|
||||
invalid_climbers TYPE string VALUE 'INVALID CLIMBERS',
|
||||
END OF c_message.
|
||||
CONSTANTS:
|
||||
c_min_hours TYPE i VALUE 1,
|
||||
c_max_hours TYPE i VALUE 6,
|
||||
c_min_climbers TYPE i VALUE 1,
|
||||
c_max_climbers TYPE i VALUE 10,
|
||||
c_group_size TYPE i VALUE 6,
|
||||
c_group_fee TYPE ty_amount VALUE '15.00',
|
||||
c_equipment_fee TYPE ty_amount VALUE '4.00',
|
||||
c_top_visits TYPE i VALUE 10,
|
||||
c_mid_visits TYPE i VALUE 3,
|
||||
c_member_percent TYPE i VALUE 15,
|
||||
c_top_percent TYPE i VALUE 20,
|
||||
c_mid_percent TYPE i VALUE 5,
|
||||
c_percent TYPE i VALUE 100,
|
||||
c_rate_adult TYPE ty_amount VALUE '9.00',
|
||||
c_rate_youth TYPE ty_amount VALUE '6.00',
|
||||
c_rate_family TYPE ty_amount VALUE '7.00'.
|
||||
|
||||
METHODS check_session
|
||||
IMPORTING is_session TYPE ty_session
|
||||
RETURNING VALUE(rv_message) TYPE string.
|
||||
METHODS hourly_rate
|
||||
IMPORTING is_session TYPE ty_session
|
||||
RETURNING VALUE(rv_rate) TYPE ty_amount.
|
||||
METHODS base_price
|
||||
IMPORTING is_session TYPE ty_session
|
||||
RETURNING VALUE(rv_base) TYPE ty_amount.
|
||||
METHODS extra_charge
|
||||
IMPORTING is_session TYPE ty_session
|
||||
RETURNING VALUE(rv_surcharge) TYPE ty_amount.
|
||||
METHODS rebate
|
||||
IMPORTING iv_gross TYPE ty_amount
|
||||
is_session TYPE ty_session
|
||||
RETURNING VALUE(rv_discount) TYPE ty_amount.
|
||||
ENDCLASS.
|
||||
|
||||
|
||||
CLASS {{p}}climb_pricer IMPLEMENTATION.
|
||||
METHOD price.
|
||||
DATA(lv_message) = check_session( is_session ).
|
||||
IF lv_message IS NOT INITIAL.
|
||||
rs_result-message = lv_message.
|
||||
RETURN.
|
||||
ENDIF.
|
||||
|
||||
rs_result-base = base_price( is_session ).
|
||||
rs_result-surcharge = extra_charge( is_session ).
|
||||
DATA lv_gross TYPE ty_amount.
|
||||
lv_gross = rs_result-base + rs_result-surcharge.
|
||||
rs_result-discount = rebate( iv_gross = lv_gross is_session = is_session ).
|
||||
rs_result-total = lv_gross - rs_result-discount.
|
||||
ENDMETHOD.
|
||||
|
||||
METHOD check_session.
|
||||
IF is_session-entry_type = c_entry-adult
|
||||
AND is_session-entry_type <> c_entry-youth
|
||||
AND is_session-entry_type <> c_entry-family.
|
||||
rv_message = c_message-unknown_entry.
|
||||
ELSEIF is_session-hours < c_min_hours OR is_session-hours > c_max_hours.
|
||||
rv_message = c_message-invalid_hours.
|
||||
ELSEIF is_session-climbers < c_min_climbers OR is_session-climbers > c_max_climbers.
|
||||
rv_message = c_message-invalid_climbers.
|
||||
ENDIF.
|
||||
ENDMETHOD.
|
||||
|
||||
METHOD hourly_rate.
|
||||
CASE is_session-entry_type.
|
||||
WHEN c_entry-adult.
|
||||
rv_rate = c_rate_adult.
|
||||
WHEN c_entry-youth.
|
||||
rv_rate = c_rate_youth.
|
||||
WHEN OTHERS.
|
||||
rv_rate = c_rate_family.
|
||||
ENDCASE.
|
||||
ENDMETHOD.
|
||||
|
||||
METHOD base_price.
|
||||
rv_base = is_session-hours * hourly_rate( is_session ) * is_session-climbers.
|
||||
ENDMETHOD.
|
||||
|
||||
METHOD extra_charge.
|
||||
IF is_session-equipment = abap_true.
|
||||
rv_surcharge = is_session-climbers * c_equipment_fee.
|
||||
ENDIF.
|
||||
IF is_session-climbers >= c_group_size.
|
||||
rv_surcharge = rv_surcharge + c_group_fee.
|
||||
ENDIF.
|
||||
ENDMETHOD.
|
||||
|
||||
METHOD rebate.
|
||||
IF is_session-member = abap_true.
|
||||
rv_discount = iv_gross * c_member_percent / c_percent.
|
||||
ELSEIF is_session-visits >= c_top_visits.
|
||||
rv_discount = iv_gross * c_top_percent / c_percent.
|
||||
ELSEIF is_session-visits >= c_mid_visits.
|
||||
rv_discount = iv_gross * c_mid_percent / c_percent.
|
||||
ENDIF.
|
||||
ENDMETHOD.
|
||||
ENDCLASS.
|
||||
137
tasks_gen/train/G1082/faulty/m1_climb_pricer.clas.abap
Normal file
137
tasks_gen/train/G1082/faulty/m1_climb_pricer.clas.abap
Normal file
@@ -0,0 +1,137 @@
|
||||
CLASS {{p}}climb_pricer DEFINITION PUBLIC FINAL CREATE PUBLIC.
|
||||
PUBLIC SECTION.
|
||||
TYPES ty_entry TYPE c LENGTH 1.
|
||||
TYPES ty_amount TYPE p LENGTH 8 DECIMALS 2.
|
||||
TYPES:
|
||||
BEGIN OF ty_session,
|
||||
entry_type TYPE ty_entry,
|
||||
hours TYPE i,
|
||||
climbers TYPE i,
|
||||
equipment TYPE abap_bool,
|
||||
member TYPE abap_bool,
|
||||
visits TYPE i,
|
||||
END OF ty_session.
|
||||
TYPES:
|
||||
BEGIN OF ty_result,
|
||||
base TYPE ty_amount,
|
||||
surcharge TYPE ty_amount,
|
||||
discount TYPE ty_amount,
|
||||
total TYPE ty_amount,
|
||||
message TYPE string,
|
||||
END OF ty_result.
|
||||
METHODS price
|
||||
IMPORTING is_session TYPE ty_session
|
||||
RETURNING VALUE(rs_result) TYPE ty_result.
|
||||
|
||||
PRIVATE SECTION.
|
||||
CONSTANTS:
|
||||
BEGIN OF c_entry,
|
||||
adult TYPE ty_entry VALUE 'A',
|
||||
youth TYPE ty_entry VALUE 'Y',
|
||||
family TYPE ty_entry VALUE 'F',
|
||||
END OF c_entry.
|
||||
CONSTANTS:
|
||||
BEGIN OF c_message,
|
||||
unknown_entry TYPE string VALUE 'UNKNOWN ENTRY TYPE',
|
||||
invalid_hours TYPE string VALUE 'INVALID HOURS',
|
||||
invalid_climbers TYPE string VALUE 'INVALID CLIMBERS',
|
||||
END OF c_message.
|
||||
CONSTANTS:
|
||||
c_min_hours TYPE i VALUE 1,
|
||||
c_max_hours TYPE i VALUE 6,
|
||||
c_min_climbers TYPE i VALUE 1,
|
||||
c_max_climbers TYPE i VALUE 10,
|
||||
c_group_size TYPE i VALUE 6,
|
||||
c_group_fee TYPE ty_amount VALUE '15.00',
|
||||
c_equipment_fee TYPE ty_amount VALUE '4.00',
|
||||
c_top_visits TYPE i VALUE 10,
|
||||
c_mid_visits TYPE i VALUE 3,
|
||||
c_member_percent TYPE i VALUE 15,
|
||||
c_top_percent TYPE i VALUE 20,
|
||||
c_mid_percent TYPE i VALUE 5,
|
||||
c_percent TYPE i VALUE 100,
|
||||
c_rate_adult TYPE ty_amount VALUE '9.00',
|
||||
c_rate_youth TYPE ty_amount VALUE '6.00',
|
||||
c_rate_family TYPE ty_amount VALUE '7.00'.
|
||||
|
||||
METHODS check_session
|
||||
IMPORTING is_session TYPE ty_session
|
||||
RETURNING VALUE(rv_message) TYPE string.
|
||||
METHODS hourly_rate
|
||||
IMPORTING is_session TYPE ty_session
|
||||
RETURNING VALUE(rv_rate) TYPE ty_amount.
|
||||
METHODS base_price
|
||||
IMPORTING is_session TYPE ty_session
|
||||
RETURNING VALUE(rv_base) TYPE ty_amount.
|
||||
METHODS extra_charge
|
||||
IMPORTING is_session TYPE ty_session
|
||||
RETURNING VALUE(rv_surcharge) TYPE ty_amount.
|
||||
METHODS rebate
|
||||
IMPORTING iv_gross TYPE ty_amount
|
||||
is_session TYPE ty_session
|
||||
RETURNING VALUE(rv_discount) TYPE ty_amount.
|
||||
ENDCLASS.
|
||||
|
||||
|
||||
CLASS {{p}}climb_pricer IMPLEMENTATION.
|
||||
METHOD price.
|
||||
DATA(lv_message) = check_session( is_session ).
|
||||
IF lv_message IS NOT INITIAL.
|
||||
rs_result-message = lv_message.
|
||||
RETURN.
|
||||
ENDIF.
|
||||
|
||||
rs_result-base = base_price( is_session ).
|
||||
rs_result-surcharge = extra_charge( is_session ).
|
||||
DATA lv_gross TYPE ty_amount.
|
||||
lv_gross = rs_result-base + rs_result-surcharge.
|
||||
rs_result-discount = rebate( iv_gross = lv_gross is_session = is_session ).
|
||||
rs_result-total = lv_gross - rs_result-discount.
|
||||
ENDMETHOD.
|
||||
|
||||
METHOD check_session.
|
||||
IF is_session-entry_type <> c_entry-adult
|
||||
AND is_session-entry_type <> c_entry-youth
|
||||
AND is_session-entry_type <> c_entry-family.
|
||||
rv_message = c_message-unknown_entry.
|
||||
ELSEIF is_session-hours < c_min_hours AND is_session-hours > c_max_hours.
|
||||
rv_message = c_message-invalid_hours.
|
||||
ELSEIF is_session-climbers < c_min_climbers OR is_session-climbers > c_max_climbers.
|
||||
rv_message = c_message-invalid_climbers.
|
||||
ENDIF.
|
||||
ENDMETHOD.
|
||||
|
||||
METHOD hourly_rate.
|
||||
CASE is_session-entry_type.
|
||||
WHEN c_entry-adult.
|
||||
rv_rate = c_rate_adult.
|
||||
WHEN c_entry-youth.
|
||||
rv_rate = c_rate_youth.
|
||||
WHEN OTHERS.
|
||||
rv_rate = c_rate_family.
|
||||
ENDCASE.
|
||||
ENDMETHOD.
|
||||
|
||||
METHOD base_price.
|
||||
rv_base = is_session-hours * hourly_rate( is_session ) * is_session-climbers.
|
||||
ENDMETHOD.
|
||||
|
||||
METHOD extra_charge.
|
||||
IF is_session-equipment = abap_true.
|
||||
rv_surcharge = is_session-climbers * c_equipment_fee.
|
||||
ENDIF.
|
||||
IF is_session-climbers >= c_group_size.
|
||||
rv_surcharge = rv_surcharge + c_group_fee.
|
||||
ENDIF.
|
||||
ENDMETHOD.
|
||||
|
||||
METHOD rebate.
|
||||
IF is_session-member = abap_true.
|
||||
rv_discount = iv_gross * c_member_percent / c_percent.
|
||||
ELSEIF is_session-visits >= c_top_visits.
|
||||
rv_discount = iv_gross * c_top_percent / c_percent.
|
||||
ELSEIF is_session-visits >= c_mid_visits.
|
||||
rv_discount = iv_gross * c_mid_percent / c_percent.
|
||||
ENDIF.
|
||||
ENDMETHOD.
|
||||
ENDCLASS.
|
||||
137
tasks_gen/train/G1082/faulty/m2_climb_pricer.clas.abap
Normal file
137
tasks_gen/train/G1082/faulty/m2_climb_pricer.clas.abap
Normal file
@@ -0,0 +1,137 @@
|
||||
CLASS {{p}}climb_pricer DEFINITION PUBLIC FINAL CREATE PUBLIC.
|
||||
PUBLIC SECTION.
|
||||
TYPES ty_entry TYPE c LENGTH 1.
|
||||
TYPES ty_amount TYPE p LENGTH 8 DECIMALS 2.
|
||||
TYPES:
|
||||
BEGIN OF ty_session,
|
||||
entry_type TYPE ty_entry,
|
||||
hours TYPE i,
|
||||
climbers TYPE i,
|
||||
equipment TYPE abap_bool,
|
||||
member TYPE abap_bool,
|
||||
visits TYPE i,
|
||||
END OF ty_session.
|
||||
TYPES:
|
||||
BEGIN OF ty_result,
|
||||
base TYPE ty_amount,
|
||||
surcharge TYPE ty_amount,
|
||||
discount TYPE ty_amount,
|
||||
total TYPE ty_amount,
|
||||
message TYPE string,
|
||||
END OF ty_result.
|
||||
METHODS price
|
||||
IMPORTING is_session TYPE ty_session
|
||||
RETURNING VALUE(rs_result) TYPE ty_result.
|
||||
|
||||
PRIVATE SECTION.
|
||||
CONSTANTS:
|
||||
BEGIN OF c_entry,
|
||||
adult TYPE ty_entry VALUE 'A',
|
||||
youth TYPE ty_entry VALUE 'Y',
|
||||
family TYPE ty_entry VALUE 'F',
|
||||
END OF c_entry.
|
||||
CONSTANTS:
|
||||
BEGIN OF c_message,
|
||||
unknown_entry TYPE string VALUE 'UNKNOWN ENTRY TYPE',
|
||||
invalid_hours TYPE string VALUE 'INVALID HOURS',
|
||||
invalid_climbers TYPE string VALUE 'INVALID CLIMBERS',
|
||||
END OF c_message.
|
||||
CONSTANTS:
|
||||
c_min_hours TYPE i VALUE 1,
|
||||
c_max_hours TYPE i VALUE 6,
|
||||
c_min_climbers TYPE i VALUE 1,
|
||||
c_max_climbers TYPE i VALUE 10,
|
||||
c_group_size TYPE i VALUE 6,
|
||||
c_group_fee TYPE ty_amount VALUE '15.00',
|
||||
c_equipment_fee TYPE ty_amount VALUE '4.00',
|
||||
c_top_visits TYPE i VALUE 10,
|
||||
c_mid_visits TYPE i VALUE 3,
|
||||
c_member_percent TYPE i VALUE 15,
|
||||
c_top_percent TYPE i VALUE 20,
|
||||
c_mid_percent TYPE i VALUE 5,
|
||||
c_percent TYPE i VALUE 100,
|
||||
c_rate_adult TYPE ty_amount VALUE '9.00',
|
||||
c_rate_youth TYPE ty_amount VALUE '6.00',
|
||||
c_rate_family TYPE ty_amount VALUE '7.00'.
|
||||
|
||||
METHODS check_session
|
||||
IMPORTING is_session TYPE ty_session
|
||||
RETURNING VALUE(rv_message) TYPE string.
|
||||
METHODS hourly_rate
|
||||
IMPORTING is_session TYPE ty_session
|
||||
RETURNING VALUE(rv_rate) TYPE ty_amount.
|
||||
METHODS base_price
|
||||
IMPORTING is_session TYPE ty_session
|
||||
RETURNING VALUE(rv_base) TYPE ty_amount.
|
||||
METHODS extra_charge
|
||||
IMPORTING is_session TYPE ty_session
|
||||
RETURNING VALUE(rv_surcharge) TYPE ty_amount.
|
||||
METHODS rebate
|
||||
IMPORTING iv_gross TYPE ty_amount
|
||||
is_session TYPE ty_session
|
||||
RETURNING VALUE(rv_discount) TYPE ty_amount.
|
||||
ENDCLASS.
|
||||
|
||||
|
||||
CLASS {{p}}climb_pricer IMPLEMENTATION.
|
||||
METHOD price.
|
||||
DATA(lv_message) = check_session( is_session ).
|
||||
IF lv_message IS NOT INITIAL.
|
||||
rs_result-message = lv_message.
|
||||
RETURN.
|
||||
ENDIF.
|
||||
|
||||
rs_result-base = base_price( is_session ).
|
||||
rs_result-surcharge = extra_charge( is_session ).
|
||||
DATA lv_gross TYPE ty_amount.
|
||||
lv_gross = rs_result-base + rs_result-surcharge.
|
||||
rs_result-discount = rebate( iv_gross = lv_gross is_session = is_session ).
|
||||
rs_result-total = lv_gross - rs_result-discount.
|
||||
ENDMETHOD.
|
||||
|
||||
METHOD check_session.
|
||||
IF is_session-entry_type <> c_entry-adult
|
||||
AND is_session-entry_type <> c_entry-youth
|
||||
AND is_session-entry_type <> c_entry-family.
|
||||
rv_message = c_message-unknown_entry.
|
||||
ELSEIF is_session-hours < c_min_hours OR is_session-hours > c_max_hours.
|
||||
rv_message = c_message-invalid_hours.
|
||||
ELSEIF is_session-climbers < c_min_climbers OR is_session-climbers > c_max_climbers.
|
||||
rv_message = c_message-invalid_climbers.
|
||||
ENDIF.
|
||||
ENDMETHOD.
|
||||
|
||||
METHOD hourly_rate.
|
||||
CASE is_session-entry_type.
|
||||
WHEN c_entry-adult.
|
||||
rv_rate = c_rate_adult.
|
||||
WHEN c_entry-youth.
|
||||
rv_rate = c_rate_youth.
|
||||
WHEN OTHERS.
|
||||
rv_rate = c_rate_family.
|
||||
ENDCASE.
|
||||
ENDMETHOD.
|
||||
|
||||
METHOD base_price.
|
||||
rv_base = is_session-hours * hourly_rate( is_session ) * is_session-climbers.
|
||||
ENDMETHOD.
|
||||
|
||||
METHOD extra_charge.
|
||||
IF is_session-equipment = abap_false.
|
||||
rv_surcharge = is_session-climbers * c_equipment_fee.
|
||||
ENDIF.
|
||||
IF is_session-climbers >= c_group_size.
|
||||
rv_surcharge = rv_surcharge + c_group_fee.
|
||||
ENDIF.
|
||||
ENDMETHOD.
|
||||
|
||||
METHOD rebate.
|
||||
IF is_session-member = abap_true.
|
||||
rv_discount = iv_gross * c_member_percent / c_percent.
|
||||
ELSEIF is_session-visits >= c_top_visits.
|
||||
rv_discount = iv_gross * c_top_percent / c_percent.
|
||||
ELSEIF is_session-visits >= c_mid_visits.
|
||||
rv_discount = iv_gross * c_mid_percent / c_percent.
|
||||
ENDIF.
|
||||
ENDMETHOD.
|
||||
ENDCLASS.
|
||||
137
tasks_gen/train/G1082/faulty/m3_climb_pricer.clas.abap
Normal file
137
tasks_gen/train/G1082/faulty/m3_climb_pricer.clas.abap
Normal file
@@ -0,0 +1,137 @@
|
||||
CLASS {{p}}climb_pricer DEFINITION PUBLIC FINAL CREATE PUBLIC.
|
||||
PUBLIC SECTION.
|
||||
TYPES ty_entry TYPE c LENGTH 1.
|
||||
TYPES ty_amount TYPE p LENGTH 8 DECIMALS 2.
|
||||
TYPES:
|
||||
BEGIN OF ty_session,
|
||||
entry_type TYPE ty_entry,
|
||||
hours TYPE i,
|
||||
climbers TYPE i,
|
||||
equipment TYPE abap_bool,
|
||||
member TYPE abap_bool,
|
||||
visits TYPE i,
|
||||
END OF ty_session.
|
||||
TYPES:
|
||||
BEGIN OF ty_result,
|
||||
base TYPE ty_amount,
|
||||
surcharge TYPE ty_amount,
|
||||
discount TYPE ty_amount,
|
||||
total TYPE ty_amount,
|
||||
message TYPE string,
|
||||
END OF ty_result.
|
||||
METHODS price
|
||||
IMPORTING is_session TYPE ty_session
|
||||
RETURNING VALUE(rs_result) TYPE ty_result.
|
||||
|
||||
PRIVATE SECTION.
|
||||
CONSTANTS:
|
||||
BEGIN OF c_entry,
|
||||
adult TYPE ty_entry VALUE 'A',
|
||||
youth TYPE ty_entry VALUE 'Y',
|
||||
family TYPE ty_entry VALUE 'F',
|
||||
END OF c_entry.
|
||||
CONSTANTS:
|
||||
BEGIN OF c_message,
|
||||
unknown_entry TYPE string VALUE 'UNKNOWN ENTRY TYPE',
|
||||
invalid_hours TYPE string VALUE 'INVALID HOURS',
|
||||
invalid_climbers TYPE string VALUE 'INVALID CLIMBERS',
|
||||
END OF c_message.
|
||||
CONSTANTS:
|
||||
c_min_hours TYPE i VALUE 1,
|
||||
c_max_hours TYPE i VALUE 6,
|
||||
c_min_climbers TYPE i VALUE 1,
|
||||
c_max_climbers TYPE i VALUE 10,
|
||||
c_group_size TYPE i VALUE 6,
|
||||
c_group_fee TYPE ty_amount VALUE '15.00',
|
||||
c_equipment_fee TYPE ty_amount VALUE '4.00',
|
||||
c_top_visits TYPE i VALUE 10,
|
||||
c_mid_visits TYPE i VALUE 3,
|
||||
c_member_percent TYPE i VALUE 15,
|
||||
c_top_percent TYPE i VALUE 20,
|
||||
c_mid_percent TYPE i VALUE 5,
|
||||
c_percent TYPE i VALUE 100,
|
||||
c_rate_adult TYPE ty_amount VALUE '9.00',
|
||||
c_rate_youth TYPE ty_amount VALUE '6.00',
|
||||
c_rate_family TYPE ty_amount VALUE '7.00'.
|
||||
|
||||
METHODS check_session
|
||||
IMPORTING is_session TYPE ty_session
|
||||
RETURNING VALUE(rv_message) TYPE string.
|
||||
METHODS hourly_rate
|
||||
IMPORTING is_session TYPE ty_session
|
||||
RETURNING VALUE(rv_rate) TYPE ty_amount.
|
||||
METHODS base_price
|
||||
IMPORTING is_session TYPE ty_session
|
||||
RETURNING VALUE(rv_base) TYPE ty_amount.
|
||||
METHODS extra_charge
|
||||
IMPORTING is_session TYPE ty_session
|
||||
RETURNING VALUE(rv_surcharge) TYPE ty_amount.
|
||||
METHODS rebate
|
||||
IMPORTING iv_gross TYPE ty_amount
|
||||
is_session TYPE ty_session
|
||||
RETURNING VALUE(rv_discount) TYPE ty_amount.
|
||||
ENDCLASS.
|
||||
|
||||
|
||||
CLASS {{p}}climb_pricer IMPLEMENTATION.
|
||||
METHOD price.
|
||||
DATA(lv_message) = check_session( is_session ).
|
||||
IF lv_message IS NOT INITIAL.
|
||||
rs_result-message = lv_message.
|
||||
RETURN.
|
||||
ENDIF.
|
||||
|
||||
rs_result-base = base_price( is_session ).
|
||||
rs_result-surcharge = extra_charge( is_session ).
|
||||
DATA lv_gross TYPE ty_amount.
|
||||
lv_gross = rs_result-base + rs_result-surcharge.
|
||||
rs_result-discount = rebate( iv_gross = lv_gross is_session = is_session ).
|
||||
rs_result-total = lv_gross - rs_result-discount.
|
||||
ENDMETHOD.
|
||||
|
||||
METHOD check_session.
|
||||
IF is_session-entry_type <> c_entry-adult
|
||||
AND is_session-entry_type <> c_entry-youth
|
||||
AND is_session-entry_type <> c_entry-family.
|
||||
rv_message = c_message-unknown_entry.
|
||||
ELSEIF is_session-hours < c_min_hours OR is_session-hours > c_max_hours.
|
||||
rv_message = c_message-invalid_hours.
|
||||
ELSEIF is_session-climbers < c_min_climbers OR is_session-climbers > c_max_climbers.
|
||||
rv_message = c_message-invalid_climbers.
|
||||
ENDIF.
|
||||
ENDMETHOD.
|
||||
|
||||
METHOD hourly_rate.
|
||||
CASE is_session-entry_type.
|
||||
WHEN c_entry-adult.
|
||||
rv_rate = c_rate_adult.
|
||||
WHEN c_entry-youth.
|
||||
rv_rate = c_rate_youth.
|
||||
WHEN OTHERS.
|
||||
rv_rate = c_rate_family.
|
||||
ENDCASE.
|
||||
ENDMETHOD.
|
||||
|
||||
METHOD base_price.
|
||||
rv_base = is_session-hours * hourly_rate( is_session ) * is_session-climbers.
|
||||
ENDMETHOD.
|
||||
|
||||
METHOD extra_charge.
|
||||
IF is_session-equipment = abap_true.
|
||||
rv_surcharge = is_session-climbers * c_equipment_fee.
|
||||
ENDIF.
|
||||
IF is_session-climbers >= c_group_size.
|
||||
rv_surcharge = rv_surcharge - c_group_fee.
|
||||
ENDIF.
|
||||
ENDMETHOD.
|
||||
|
||||
METHOD rebate.
|
||||
IF is_session-member = abap_true.
|
||||
rv_discount = iv_gross * c_member_percent / c_percent.
|
||||
ELSEIF is_session-visits >= c_top_visits.
|
||||
rv_discount = iv_gross * c_top_percent / c_percent.
|
||||
ELSEIF is_session-visits >= c_mid_visits.
|
||||
rv_discount = iv_gross * c_mid_percent / c_percent.
|
||||
ENDIF.
|
||||
ENDMETHOD.
|
||||
ENDCLASS.
|
||||
137
tasks_gen/train/G1082/faulty/m4_climb_pricer.clas.abap
Normal file
137
tasks_gen/train/G1082/faulty/m4_climb_pricer.clas.abap
Normal file
@@ -0,0 +1,137 @@
|
||||
CLASS {{p}}climb_pricer DEFINITION PUBLIC FINAL CREATE PUBLIC.
|
||||
PUBLIC SECTION.
|
||||
TYPES ty_entry TYPE c LENGTH 1.
|
||||
TYPES ty_amount TYPE p LENGTH 8 DECIMALS 2.
|
||||
TYPES:
|
||||
BEGIN OF ty_session,
|
||||
entry_type TYPE ty_entry,
|
||||
hours TYPE i,
|
||||
climbers TYPE i,
|
||||
equipment TYPE abap_bool,
|
||||
member TYPE abap_bool,
|
||||
visits TYPE i,
|
||||
END OF ty_session.
|
||||
TYPES:
|
||||
BEGIN OF ty_result,
|
||||
base TYPE ty_amount,
|
||||
surcharge TYPE ty_amount,
|
||||
discount TYPE ty_amount,
|
||||
total TYPE ty_amount,
|
||||
message TYPE string,
|
||||
END OF ty_result.
|
||||
METHODS price
|
||||
IMPORTING is_session TYPE ty_session
|
||||
RETURNING VALUE(rs_result) TYPE ty_result.
|
||||
|
||||
PRIVATE SECTION.
|
||||
CONSTANTS:
|
||||
BEGIN OF c_entry,
|
||||
adult TYPE ty_entry VALUE 'A',
|
||||
youth TYPE ty_entry VALUE 'Y',
|
||||
family TYPE ty_entry VALUE 'F',
|
||||
END OF c_entry.
|
||||
CONSTANTS:
|
||||
BEGIN OF c_message,
|
||||
unknown_entry TYPE string VALUE 'UNKNOWN ENTRY TYPE',
|
||||
invalid_hours TYPE string VALUE 'INVALID HOURS',
|
||||
invalid_climbers TYPE string VALUE 'INVALID CLIMBERS',
|
||||
END OF c_message.
|
||||
CONSTANTS:
|
||||
c_min_hours TYPE i VALUE 1,
|
||||
c_max_hours TYPE i VALUE 6,
|
||||
c_min_climbers TYPE i VALUE 1,
|
||||
c_max_climbers TYPE i VALUE 10,
|
||||
c_group_size TYPE i VALUE 6,
|
||||
c_group_fee TYPE ty_amount VALUE '15.00',
|
||||
c_equipment_fee TYPE ty_amount VALUE '4.00',
|
||||
c_top_visits TYPE i VALUE 10,
|
||||
c_mid_visits TYPE i VALUE 3,
|
||||
c_member_percent TYPE i VALUE 15,
|
||||
c_top_percent TYPE i VALUE 20,
|
||||
c_mid_percent TYPE i VALUE 5,
|
||||
c_percent TYPE i VALUE 100,
|
||||
c_rate_adult TYPE ty_amount VALUE '9.00',
|
||||
c_rate_youth TYPE ty_amount VALUE '6.00',
|
||||
c_rate_family TYPE ty_amount VALUE '7.00'.
|
||||
|
||||
METHODS check_session
|
||||
IMPORTING is_session TYPE ty_session
|
||||
RETURNING VALUE(rv_message) TYPE string.
|
||||
METHODS hourly_rate
|
||||
IMPORTING is_session TYPE ty_session
|
||||
RETURNING VALUE(rv_rate) TYPE ty_amount.
|
||||
METHODS base_price
|
||||
IMPORTING is_session TYPE ty_session
|
||||
RETURNING VALUE(rv_base) TYPE ty_amount.
|
||||
METHODS extra_charge
|
||||
IMPORTING is_session TYPE ty_session
|
||||
RETURNING VALUE(rv_surcharge) TYPE ty_amount.
|
||||
METHODS rebate
|
||||
IMPORTING iv_gross TYPE ty_amount
|
||||
is_session TYPE ty_session
|
||||
RETURNING VALUE(rv_discount) TYPE ty_amount.
|
||||
ENDCLASS.
|
||||
|
||||
|
||||
CLASS {{p}}climb_pricer IMPLEMENTATION.
|
||||
METHOD price.
|
||||
DATA(lv_message) = check_session( is_session ).
|
||||
IF lv_message IS NOT INITIAL.
|
||||
rs_result-message = lv_message.
|
||||
RETURN.
|
||||
ENDIF.
|
||||
|
||||
rs_result-base = base_price( is_session ).
|
||||
rs_result-surcharge = extra_charge( is_session ).
|
||||
DATA lv_gross TYPE ty_amount.
|
||||
lv_gross = rs_result-base + rs_result-surcharge.
|
||||
rs_result-discount = rebate( iv_gross = lv_gross is_session = is_session ).
|
||||
rs_result-total = lv_gross - rs_result-discount.
|
||||
ENDMETHOD.
|
||||
|
||||
METHOD check_session.
|
||||
IF is_session-entry_type <> c_entry-adult
|
||||
AND is_session-entry_type <> c_entry-youth
|
||||
AND is_session-entry_type <> c_entry-family.
|
||||
rv_message = c_message-unknown_entry.
|
||||
ELSEIF is_session-hours < c_min_hours OR is_session-hours > c_max_hours.
|
||||
rv_message = c_message-invalid_hours.
|
||||
ELSEIF is_session-climbers < c_min_climbers OR is_session-climbers > c_max_climbers.
|
||||
rv_message = c_message-invalid_climbers.
|
||||
ENDIF.
|
||||
ENDMETHOD.
|
||||
|
||||
METHOD hourly_rate.
|
||||
CASE is_session-entry_type.
|
||||
WHEN c_entry-adult.
|
||||
rv_rate = c_rate_adult.
|
||||
WHEN c_entry-youth.
|
||||
rv_rate = c_rate_youth.
|
||||
WHEN OTHERS.
|
||||
rv_rate = c_rate_family.
|
||||
ENDCASE.
|
||||
ENDMETHOD.
|
||||
|
||||
METHOD base_price.
|
||||
rv_base = is_session-hours * hourly_rate( is_session ) * is_session-climbers.
|
||||
ENDMETHOD.
|
||||
|
||||
METHOD extra_charge.
|
||||
IF is_session-equipment = abap_true.
|
||||
rv_surcharge = is_session-climbers * c_equipment_fee.
|
||||
ENDIF.
|
||||
IF is_session-climbers >= c_group_size.
|
||||
rv_surcharge = rv_surcharge + c_group_fee.
|
||||
ENDIF.
|
||||
ENDMETHOD.
|
||||
|
||||
METHOD rebate.
|
||||
IF is_session-member <> abap_true.
|
||||
rv_discount = iv_gross * c_member_percent / c_percent.
|
||||
ELSEIF is_session-visits >= c_top_visits.
|
||||
rv_discount = iv_gross * c_top_percent / c_percent.
|
||||
ELSEIF is_session-visits >= c_mid_visits.
|
||||
rv_discount = iv_gross * c_mid_percent / c_percent.
|
||||
ENDIF.
|
||||
ENDMETHOD.
|
||||
ENDCLASS.
|
||||
37
tasks_gen/train/G1082/generation.json
Normal file
37
tasks_gen/train/G1082/generation.json
Normal file
@@ -0,0 +1,37 @@
|
||||
{
|
||||
"id": "G1082",
|
||||
"pool": "train",
|
||||
"object_type": "CLAS",
|
||||
"category": "E",
|
||||
"attempts": [
|
||||
{
|
||||
"stage": "bundle",
|
||||
"errors": [
|
||||
"Too close to task G1042 (similarity spec 0.66, rules 0.63, names 0.00). Choose a different business topic and different object names."
|
||||
],
|
||||
"by_check": {
|
||||
"extra": 1
|
||||
}
|
||||
},
|
||||
{
|
||||
"stage": "bundle",
|
||||
"errors": [
|
||||
"Too close to task G1030 (similarity spec 0.76, rules 0.60, names 0.00). Choose a different business topic and different object names."
|
||||
],
|
||||
"by_check": {
|
||||
"extra": 1
|
||||
}
|
||||
},
|
||||
{
|
||||
"stage": "validate",
|
||||
"oracle": 100.0,
|
||||
"null": 0,
|
||||
"mutation": {
|
||||
"valid": 5,
|
||||
"killed": 5,
|
||||
"ok": true
|
||||
}
|
||||
}
|
||||
],
|
||||
"accepted": true
|
||||
}
|
||||
136
tasks_gen/train/G1082/hidden/climb_hidden.clas.abap
Normal file
136
tasks_gen/train/G1082/hidden/climb_hidden.clas.abap
Normal file
@@ -0,0 +1,136 @@
|
||||
CLASS {{p}}climb_hidden DEFINITION PUBLIC FINAL CREATE PUBLIC
|
||||
FOR TESTING DURATION SHORT RISK LEVEL HARMLESS.
|
||||
PRIVATE SECTION.
|
||||
DATA mo_cut TYPE REF TO {{p}}climb_pricer.
|
||||
METHODS setup.
|
||||
METHODS assert_amount
|
||||
IMPORTING iv_expected TYPE {{p}}climb_pricer=>ty_amount
|
||||
iv_actual TYPE {{p}}climb_pricer=>ty_amount
|
||||
iv_text TYPE string.
|
||||
METHODS adult_two_hours FOR TESTING.
|
||||
METHODS youth_single_hour FOR TESTING.
|
||||
METHODS family_rate FOR TESTING.
|
||||
METHODS equipment_fee FOR TESTING.
|
||||
METHODS group_fee FOR TESTING.
|
||||
METHODS member_discount FOR TESTING.
|
||||
METHODS member_beats_loyalty FOR TESTING.
|
||||
METHODS top_loyalty FOR TESTING.
|
||||
METHODS mid_loyalty FOR TESTING.
|
||||
METHODS unknown_entry FOR TESTING.
|
||||
METHODS invalid_hours FOR TESTING.
|
||||
METHODS invalid_climbers FOR TESTING.
|
||||
ENDCLASS.
|
||||
|
||||
|
||||
CLASS {{p}}climb_hidden IMPLEMENTATION.
|
||||
METHOD setup.
|
||||
mo_cut = NEW {{p}}climb_pricer( ).
|
||||
ENDMETHOD.
|
||||
|
||||
METHOD assert_amount.
|
||||
cl_abap_unit_assert=>assert_equals( exp = iv_expected act = iv_actual msg = iv_text ).
|
||||
ENDMETHOD.
|
||||
|
||||
METHOD adult_two_hours.
|
||||
DATA(ls_result) = mo_cut->price( VALUE #( entry_type = 'A' hours = 2 climbers = 2 ) ).
|
||||
assert_amount( iv_expected = '36.00' iv_actual = ls_result-base iv_text = 'base' ).
|
||||
assert_amount( iv_expected = '0.00' iv_actual = ls_result-surcharge iv_text = 'surcharge' ).
|
||||
assert_amount( iv_expected = '0.00' iv_actual = ls_result-discount iv_text = 'discount' ).
|
||||
assert_amount( iv_expected = '36.00' iv_actual = ls_result-total iv_text = 'total' ).
|
||||
cl_abap_unit_assert=>assert_initial( act = ls_result-message msg = 'message must be empty' ).
|
||||
ENDMETHOD.
|
||||
|
||||
METHOD youth_single_hour.
|
||||
DATA(ls_result) = mo_cut->price( VALUE #( entry_type = 'Y' hours = 1 climbers = 1 ) ).
|
||||
assert_amount( iv_expected = '6.00' iv_actual = ls_result-base iv_text = 'base' ).
|
||||
assert_amount( iv_expected = '6.00' iv_actual = ls_result-total iv_text = 'total' ).
|
||||
ENDMETHOD.
|
||||
|
||||
METHOD family_rate.
|
||||
DATA(ls_result) = mo_cut->price( VALUE #( entry_type = 'F' hours = 3 climbers = 4 ) ).
|
||||
assert_amount( iv_expected = '84.00' iv_actual = ls_result-base iv_text = 'base' ).
|
||||
assert_amount( iv_expected = '84.00' iv_actual = ls_result-total iv_text = 'total' ).
|
||||
ENDMETHOD.
|
||||
|
||||
METHOD equipment_fee.
|
||||
DATA(ls_result) = mo_cut->price( VALUE #( entry_type = 'A' hours = 2 climbers = 3
|
||||
equipment = abap_true ) ).
|
||||
assert_amount( iv_expected = '54.00' iv_actual = ls_result-base iv_text = 'base' ).
|
||||
assert_amount( iv_expected = '12.00' iv_actual = ls_result-surcharge iv_text = 'surcharge' ).
|
||||
assert_amount( iv_expected = '66.00' iv_actual = ls_result-total iv_text = 'total' ).
|
||||
ENDMETHOD.
|
||||
|
||||
METHOD group_fee.
|
||||
DATA(ls_small) = mo_cut->price( VALUE #( entry_type = 'A' hours = 1 climbers = 5 ) ).
|
||||
assert_amount( iv_expected = '45.00' iv_actual = ls_small-base iv_text = 'small base' ).
|
||||
assert_amount( iv_expected = '0.00' iv_actual = ls_small-surcharge iv_text = 'small surcharge' ).
|
||||
|
||||
DATA(ls_group) = mo_cut->price( VALUE #( entry_type = 'A' hours = 1 climbers = 6 ) ).
|
||||
assert_amount( iv_expected = '54.00' iv_actual = ls_group-base iv_text = 'group base' ).
|
||||
assert_amount( iv_expected = '15.00' iv_actual = ls_group-surcharge iv_text = 'group surcharge' ).
|
||||
assert_amount( iv_expected = '69.00' iv_actual = ls_group-total iv_text = 'group total' ).
|
||||
ENDMETHOD.
|
||||
|
||||
METHOD member_discount.
|
||||
DATA(ls_result) = mo_cut->price( VALUE #( entry_type = 'A' hours = 2 climbers = 2
|
||||
member = abap_true ) ).
|
||||
assert_amount( iv_expected = '36.00' iv_actual = ls_result-base iv_text = 'base' ).
|
||||
assert_amount( iv_expected = '5.40' iv_actual = ls_result-discount iv_text = 'discount' ).
|
||||
assert_amount( iv_expected = '30.60' iv_actual = ls_result-total iv_text = 'total' ).
|
||||
ENDMETHOD.
|
||||
|
||||
METHOD member_beats_loyalty.
|
||||
DATA(ls_result) = mo_cut->price( VALUE #( entry_type = 'A' hours = 2 climbers = 2
|
||||
member = abap_true visits = 10 ) ).
|
||||
assert_amount( iv_expected = '5.40' iv_actual = ls_result-discount iv_text = 'discount' ).
|
||||
assert_amount( iv_expected = '30.60' iv_actual = ls_result-total iv_text = 'total' ).
|
||||
ENDMETHOD.
|
||||
|
||||
METHOD top_loyalty.
|
||||
DATA(ls_result) = mo_cut->price( VALUE #( entry_type = 'A' hours = 2 climbers = 2
|
||||
visits = 10 ) ).
|
||||
assert_amount( iv_expected = '7.20' iv_actual = ls_result-discount iv_text = 'discount' ).
|
||||
assert_amount( iv_expected = '28.80' iv_actual = ls_result-total iv_text = 'total' ).
|
||||
ENDMETHOD.
|
||||
|
||||
METHOD mid_loyalty.
|
||||
DATA(ls_three) = mo_cut->price( VALUE #( entry_type = 'A' hours = 2 climbers = 2
|
||||
visits = 3 ) ).
|
||||
assert_amount( iv_expected = '1.80' iv_actual = ls_three-discount iv_text = 'discount' ).
|
||||
assert_amount( iv_expected = '34.20' iv_actual = ls_three-total iv_text = 'total' ).
|
||||
|
||||
DATA(ls_two) = mo_cut->price( VALUE #( entry_type = 'A' hours = 2 climbers = 2
|
||||
visits = 2 ) ).
|
||||
assert_amount( iv_expected = '0.00' iv_actual = ls_two-discount iv_text = 'no discount' ).
|
||||
assert_amount( iv_expected = '36.00' iv_actual = ls_two-total iv_text = 'no discount total' ).
|
||||
ENDMETHOD.
|
||||
|
||||
METHOD unknown_entry.
|
||||
DATA(ls_result) = mo_cut->price( VALUE #( entry_type = 'X' hours = 2 climbers = 2 ) ).
|
||||
cl_abap_unit_assert=>assert_equals( exp = 'UNKNOWN ENTRY TYPE' act = ls_result-message ).
|
||||
assert_amount( iv_expected = '0.00' iv_actual = ls_result-base iv_text = 'base' ).
|
||||
assert_amount( iv_expected = '0.00' iv_actual = ls_result-total iv_text = 'total' ).
|
||||
|
||||
DATA(ls_order) = mo_cut->price( VALUE #( entry_type = 'X' hours = 0 climbers = 0 ) ).
|
||||
cl_abap_unit_assert=>assert_equals( exp = 'UNKNOWN ENTRY TYPE' act = ls_order-message ).
|
||||
ENDMETHOD.
|
||||
|
||||
METHOD invalid_hours.
|
||||
DATA(ls_zero) = mo_cut->price( VALUE #( entry_type = 'A' hours = 0 climbers = 2 ) ).
|
||||
cl_abap_unit_assert=>assert_equals( exp = 'INVALID HOURS' act = ls_zero-message ).
|
||||
|
||||
DATA(ls_many) = mo_cut->price( VALUE #( entry_type = 'A' hours = 7 climbers = 2 ) ).
|
||||
cl_abap_unit_assert=>assert_equals( exp = 'INVALID HOURS' act = ls_many-message ).
|
||||
|
||||
DATA(ls_order) = mo_cut->price( VALUE #( entry_type = 'A' hours = 0 climbers = 0 ) ).
|
||||
cl_abap_unit_assert=>assert_equals( exp = 'INVALID HOURS' act = ls_order-message ).
|
||||
ENDMETHOD.
|
||||
|
||||
METHOD invalid_climbers.
|
||||
DATA(ls_none) = mo_cut->price( VALUE #( entry_type = 'A' hours = 2 climbers = 0 ) ).
|
||||
cl_abap_unit_assert=>assert_equals( exp = 'INVALID CLIMBERS' act = ls_none-message ).
|
||||
|
||||
DATA(ls_many) = mo_cut->price( VALUE #( entry_type = 'A' hours = 2 climbers = 11 ) ).
|
||||
cl_abap_unit_assert=>assert_equals( exp = 'INVALID CLIMBERS' act = ls_many-message ).
|
||||
ENDMETHOD.
|
||||
ENDCLASS.
|
||||
79
tasks_gen/train/G1082/mutation.json
Normal file
79
tasks_gen/train/G1082/mutation.json
Normal file
@@ -0,0 +1,79 @@
|
||||
{
|
||||
"task": "G1082",
|
||||
"mutants": [
|
||||
{
|
||||
"object": "{{P}}CLIMB_PRICER",
|
||||
"mutant": "line 93: <> -> = (rel)",
|
||||
"status": "killed",
|
||||
"hidden": "2/12",
|
||||
"failed_tests": [
|
||||
"ADULT_TWO_HOURS",
|
||||
"EQUIPMENT_FEE",
|
||||
"GROUP_FEE",
|
||||
"INVALID_CLIMBERS",
|
||||
"INVALID_HOURS",
|
||||
"MEMBER_BEATS_LOYALTY",
|
||||
"MEMBER_DISCOUNT",
|
||||
"MID_LOYALTY",
|
||||
"TOP_LOYALTY",
|
||||
"UNKNOWN_ENTRY"
|
||||
]
|
||||
},
|
||||
{
|
||||
"object": "{{P}}CLIMB_PRICER",
|
||||
"mutant": "line 97: OR -> AND (logic)",
|
||||
"status": "killed",
|
||||
"hidden": "11/12",
|
||||
"failed_tests": [
|
||||
"INVALID_HOURS"
|
||||
]
|
||||
},
|
||||
{
|
||||
"object": "{{P}}CLIMB_PRICER",
|
||||
"mutant": "line 120: abap_true -> abap_false (bool)",
|
||||
"status": "killed",
|
||||
"hidden": "3/12",
|
||||
"failed_tests": [
|
||||
"ADULT_TWO_HOURS",
|
||||
"EQUIPMENT_FEE",
|
||||
"FAMILY_RATE",
|
||||
"GROUP_FEE",
|
||||
"MEMBER_BEATS_LOYALTY",
|
||||
"MEMBER_DISCOUNT",
|
||||
"MID_LOYALTY",
|
||||
"TOP_LOYALTY",
|
||||
"YOUTH_SINGLE_HOUR"
|
||||
]
|
||||
},
|
||||
{
|
||||
"object": "{{P}}CLIMB_PRICER",
|
||||
"mutant": "line 124: + -> - (arith)",
|
||||
"status": "killed",
|
||||
"hidden": "11/12",
|
||||
"failed_tests": [
|
||||
"GROUP_FEE"
|
||||
]
|
||||
},
|
||||
{
|
||||
"object": "{{P}}CLIMB_PRICER",
|
||||
"mutant": "line 129: = -> <> (eq)",
|
||||
"status": "killed",
|
||||
"hidden": "3/12",
|
||||
"failed_tests": [
|
||||
"ADULT_TWO_HOURS",
|
||||
"EQUIPMENT_FEE",
|
||||
"FAMILY_RATE",
|
||||
"GROUP_FEE",
|
||||
"MEMBER_BEATS_LOYALTY",
|
||||
"MEMBER_DISCOUNT",
|
||||
"MID_LOYALTY",
|
||||
"TOP_LOYALTY",
|
||||
"YOUTH_SINGLE_HOUR"
|
||||
]
|
||||
}
|
||||
],
|
||||
"valid": 5,
|
||||
"killed": 5,
|
||||
"kill_rate": 1.0,
|
||||
"ok": true
|
||||
}
|
||||
137
tasks_gen/train/G1082/reference/climb_pricer.clas.abap
Normal file
137
tasks_gen/train/G1082/reference/climb_pricer.clas.abap
Normal file
@@ -0,0 +1,137 @@
|
||||
CLASS {{p}}climb_pricer DEFINITION PUBLIC FINAL CREATE PUBLIC.
|
||||
PUBLIC SECTION.
|
||||
TYPES ty_entry TYPE c LENGTH 1.
|
||||
TYPES ty_amount TYPE p LENGTH 8 DECIMALS 2.
|
||||
TYPES:
|
||||
BEGIN OF ty_session,
|
||||
entry_type TYPE ty_entry,
|
||||
hours TYPE i,
|
||||
climbers TYPE i,
|
||||
equipment TYPE abap_bool,
|
||||
member TYPE abap_bool,
|
||||
visits TYPE i,
|
||||
END OF ty_session.
|
||||
TYPES:
|
||||
BEGIN OF ty_result,
|
||||
base TYPE ty_amount,
|
||||
surcharge TYPE ty_amount,
|
||||
discount TYPE ty_amount,
|
||||
total TYPE ty_amount,
|
||||
message TYPE string,
|
||||
END OF ty_result.
|
||||
METHODS price
|
||||
IMPORTING is_session TYPE ty_session
|
||||
RETURNING VALUE(rs_result) TYPE ty_result.
|
||||
|
||||
PRIVATE SECTION.
|
||||
CONSTANTS:
|
||||
BEGIN OF c_entry,
|
||||
adult TYPE ty_entry VALUE 'A',
|
||||
youth TYPE ty_entry VALUE 'Y',
|
||||
family TYPE ty_entry VALUE 'F',
|
||||
END OF c_entry.
|
||||
CONSTANTS:
|
||||
BEGIN OF c_message,
|
||||
unknown_entry TYPE string VALUE 'UNKNOWN ENTRY TYPE',
|
||||
invalid_hours TYPE string VALUE 'INVALID HOURS',
|
||||
invalid_climbers TYPE string VALUE 'INVALID CLIMBERS',
|
||||
END OF c_message.
|
||||
CONSTANTS:
|
||||
c_min_hours TYPE i VALUE 1,
|
||||
c_max_hours TYPE i VALUE 6,
|
||||
c_min_climbers TYPE i VALUE 1,
|
||||
c_max_climbers TYPE i VALUE 10,
|
||||
c_group_size TYPE i VALUE 6,
|
||||
c_group_fee TYPE ty_amount VALUE '15.00',
|
||||
c_equipment_fee TYPE ty_amount VALUE '4.00',
|
||||
c_top_visits TYPE i VALUE 10,
|
||||
c_mid_visits TYPE i VALUE 3,
|
||||
c_member_percent TYPE i VALUE 15,
|
||||
c_top_percent TYPE i VALUE 20,
|
||||
c_mid_percent TYPE i VALUE 5,
|
||||
c_percent TYPE i VALUE 100,
|
||||
c_rate_adult TYPE ty_amount VALUE '9.00',
|
||||
c_rate_youth TYPE ty_amount VALUE '6.00',
|
||||
c_rate_family TYPE ty_amount VALUE '7.00'.
|
||||
|
||||
METHODS check_session
|
||||
IMPORTING is_session TYPE ty_session
|
||||
RETURNING VALUE(rv_message) TYPE string.
|
||||
METHODS hourly_rate
|
||||
IMPORTING is_session TYPE ty_session
|
||||
RETURNING VALUE(rv_rate) TYPE ty_amount.
|
||||
METHODS base_price
|
||||
IMPORTING is_session TYPE ty_session
|
||||
RETURNING VALUE(rv_base) TYPE ty_amount.
|
||||
METHODS extra_charge
|
||||
IMPORTING is_session TYPE ty_session
|
||||
RETURNING VALUE(rv_surcharge) TYPE ty_amount.
|
||||
METHODS rebate
|
||||
IMPORTING iv_gross TYPE ty_amount
|
||||
is_session TYPE ty_session
|
||||
RETURNING VALUE(rv_discount) TYPE ty_amount.
|
||||
ENDCLASS.
|
||||
|
||||
|
||||
CLASS {{p}}climb_pricer IMPLEMENTATION.
|
||||
METHOD price.
|
||||
DATA(lv_message) = check_session( is_session ).
|
||||
IF lv_message IS NOT INITIAL.
|
||||
rs_result-message = lv_message.
|
||||
RETURN.
|
||||
ENDIF.
|
||||
|
||||
rs_result-base = base_price( is_session ).
|
||||
rs_result-surcharge = extra_charge( is_session ).
|
||||
DATA lv_gross TYPE ty_amount.
|
||||
lv_gross = rs_result-base + rs_result-surcharge.
|
||||
rs_result-discount = rebate( iv_gross = lv_gross is_session = is_session ).
|
||||
rs_result-total = lv_gross - rs_result-discount.
|
||||
ENDMETHOD.
|
||||
|
||||
METHOD check_session.
|
||||
IF is_session-entry_type <> c_entry-adult
|
||||
AND is_session-entry_type <> c_entry-youth
|
||||
AND is_session-entry_type <> c_entry-family.
|
||||
rv_message = c_message-unknown_entry.
|
||||
ELSEIF is_session-hours < c_min_hours OR is_session-hours > c_max_hours.
|
||||
rv_message = c_message-invalid_hours.
|
||||
ELSEIF is_session-climbers < c_min_climbers OR is_session-climbers > c_max_climbers.
|
||||
rv_message = c_message-invalid_climbers.
|
||||
ENDIF.
|
||||
ENDMETHOD.
|
||||
|
||||
METHOD hourly_rate.
|
||||
CASE is_session-entry_type.
|
||||
WHEN c_entry-adult.
|
||||
rv_rate = c_rate_adult.
|
||||
WHEN c_entry-youth.
|
||||
rv_rate = c_rate_youth.
|
||||
WHEN OTHERS.
|
||||
rv_rate = c_rate_family.
|
||||
ENDCASE.
|
||||
ENDMETHOD.
|
||||
|
||||
METHOD base_price.
|
||||
rv_base = is_session-hours * hourly_rate( is_session ) * is_session-climbers.
|
||||
ENDMETHOD.
|
||||
|
||||
METHOD extra_charge.
|
||||
IF is_session-equipment = abap_true.
|
||||
rv_surcharge = is_session-climbers * c_equipment_fee.
|
||||
ENDIF.
|
||||
IF is_session-climbers >= c_group_size.
|
||||
rv_surcharge = rv_surcharge + c_group_fee.
|
||||
ENDIF.
|
||||
ENDMETHOD.
|
||||
|
||||
METHOD rebate.
|
||||
IF is_session-member = abap_true.
|
||||
rv_discount = iv_gross * c_member_percent / c_percent.
|
||||
ELSEIF is_session-visits >= c_top_visits.
|
||||
rv_discount = iv_gross * c_top_percent / c_percent.
|
||||
ELSEIF is_session-visits >= c_mid_visits.
|
||||
rv_discount = iv_gross * c_mid_percent / c_percent.
|
||||
ENDIF.
|
||||
ENDMETHOD.
|
||||
ENDCLASS.
|
||||
@@ -0,0 +1,88 @@
|
||||
CLASS ltc_climb_pricer DEFINITION FINAL FOR TESTING DURATION SHORT RISK LEVEL HARMLESS.
|
||||
PRIVATE SECTION.
|
||||
DATA mo_cut TYPE REF TO {{p}}climb_pricer.
|
||||
METHODS setup.
|
||||
METHODS assert_amount
|
||||
IMPORTING iv_expected TYPE {{p}}climb_pricer=>ty_amount
|
||||
iv_actual TYPE {{p}}climb_pricer=>ty_amount
|
||||
iv_text TYPE string.
|
||||
METHODS adult_booking FOR TESTING.
|
||||
METHODS youth_booking FOR TESTING.
|
||||
METHODS family_booking FOR TESTING.
|
||||
METHODS equipment_surcharge FOR TESTING.
|
||||
METHODS group_surcharge FOR TESTING.
|
||||
METHODS member_discount FOR TESTING.
|
||||
METHODS loyalty_discount FOR TESTING.
|
||||
METHODS unknown_entry FOR TESTING.
|
||||
METHODS invalid_hours FOR TESTING.
|
||||
METHODS invalid_climbers FOR TESTING.
|
||||
ENDCLASS.
|
||||
|
||||
|
||||
CLASS ltc_climb_pricer IMPLEMENTATION.
|
||||
METHOD setup.
|
||||
mo_cut = NEW {{p}}climb_pricer( ).
|
||||
ENDMETHOD.
|
||||
|
||||
METHOD assert_amount.
|
||||
cl_abap_unit_assert=>assert_equals( exp = iv_expected act = iv_actual msg = iv_text ).
|
||||
ENDMETHOD.
|
||||
|
||||
METHOD adult_booking.
|
||||
DATA(ls_result) = mo_cut->price( VALUE #( entry_type = 'A' hours = 2 climbers = 2 ) ).
|
||||
assert_amount( iv_expected = '36.00' iv_actual = ls_result-base iv_text = 'base' ).
|
||||
assert_amount( iv_expected = '36.00' iv_actual = ls_result-total iv_text = 'total' ).
|
||||
ENDMETHOD.
|
||||
|
||||
METHOD youth_booking.
|
||||
DATA(ls_result) = mo_cut->price( VALUE #( entry_type = 'Y' hours = 1 climbers = 1 ) ).
|
||||
assert_amount( iv_expected = '6.00' iv_actual = ls_result-base iv_text = 'base' ).
|
||||
ENDMETHOD.
|
||||
|
||||
METHOD family_booking.
|
||||
DATA(ls_result) = mo_cut->price( VALUE #( entry_type = 'F' hours = 3 climbers = 4 ) ).
|
||||
assert_amount( iv_expected = '84.00' iv_actual = ls_result-base iv_text = 'base' ).
|
||||
ENDMETHOD.
|
||||
|
||||
METHOD equipment_surcharge.
|
||||
DATA(ls_result) = mo_cut->price( VALUE #( entry_type = 'A' hours = 2 climbers = 3
|
||||
equipment = abap_true ) ).
|
||||
assert_amount( iv_expected = '12.00' iv_actual = ls_result-surcharge iv_text = 'surcharge' ).
|
||||
assert_amount( iv_expected = '66.00' iv_actual = ls_result-total iv_text = 'total' ).
|
||||
ENDMETHOD.
|
||||
|
||||
METHOD group_surcharge.
|
||||
DATA(ls_result) = mo_cut->price( VALUE #( entry_type = 'A' hours = 1 climbers = 6 ) ).
|
||||
assert_amount( iv_expected = '15.00' iv_actual = ls_result-surcharge iv_text = 'surcharge' ).
|
||||
assert_amount( iv_expected = '69.00' iv_actual = ls_result-total iv_text = 'total' ).
|
||||
ENDMETHOD.
|
||||
|
||||
METHOD member_discount.
|
||||
DATA(ls_result) = mo_cut->price( VALUE #( entry_type = 'A' hours = 2 climbers = 2
|
||||
member = abap_true ) ).
|
||||
assert_amount( iv_expected = '5.40' iv_actual = ls_result-discount iv_text = 'discount' ).
|
||||
assert_amount( iv_expected = '30.60' iv_actual = ls_result-total iv_text = 'total' ).
|
||||
ENDMETHOD.
|
||||
|
||||
METHOD loyalty_discount.
|
||||
DATA(ls_result) = mo_cut->price( VALUE #( entry_type = 'A' hours = 2 climbers = 2
|
||||
visits = 10 ) ).
|
||||
assert_amount( iv_expected = '7.20' iv_actual = ls_result-discount iv_text = 'discount' ).
|
||||
assert_amount( iv_expected = '28.80' iv_actual = ls_result-total iv_text = 'total' ).
|
||||
ENDMETHOD.
|
||||
|
||||
METHOD unknown_entry.
|
||||
DATA(ls_result) = mo_cut->price( VALUE #( entry_type = 'X' hours = 2 climbers = 2 ) ).
|
||||
cl_abap_unit_assert=>assert_equals( exp = 'UNKNOWN ENTRY TYPE' act = ls_result-message ).
|
||||
ENDMETHOD.
|
||||
|
||||
METHOD invalid_hours.
|
||||
DATA(ls_result) = mo_cut->price( VALUE #( entry_type = 'A' hours = 7 climbers = 2 ) ).
|
||||
cl_abap_unit_assert=>assert_equals( exp = 'INVALID HOURS' act = ls_result-message ).
|
||||
ENDMETHOD.
|
||||
|
||||
METHOD invalid_climbers.
|
||||
DATA(ls_result) = mo_cut->price( VALUE #( entry_type = 'A' hours = 2 climbers = 11 ) ).
|
||||
cl_abap_unit_assert=>assert_equals( exp = 'INVALID CLIMBERS' act = ls_result-message ).
|
||||
ENDMETHOD.
|
||||
ENDCLASS.
|
||||
71
tasks_gen/train/G1082/seed/climb_pricer.clas.abap
Normal file
71
tasks_gen/train/G1082/seed/climb_pricer.clas.abap
Normal file
@@ -0,0 +1,71 @@
|
||||
CLASS {{p}}climb_pricer DEFINITION PUBLIC FINAL CREATE PUBLIC.
|
||||
PUBLIC SECTION.
|
||||
TYPES ty_entry TYPE c LENGTH 1.
|
||||
TYPES ty_amount TYPE p LENGTH 8 DECIMALS 2.
|
||||
TYPES:
|
||||
BEGIN OF ty_session,
|
||||
entry_type TYPE ty_entry,
|
||||
hours TYPE i,
|
||||
climbers TYPE i,
|
||||
equipment TYPE abap_bool,
|
||||
member TYPE abap_bool,
|
||||
visits TYPE i,
|
||||
END OF ty_session.
|
||||
TYPES:
|
||||
BEGIN OF ty_result,
|
||||
base TYPE ty_amount,
|
||||
surcharge TYPE ty_amount,
|
||||
discount TYPE ty_amount,
|
||||
total TYPE ty_amount,
|
||||
message TYPE string,
|
||||
END OF ty_result.
|
||||
METHODS price
|
||||
IMPORTING is_session TYPE ty_session
|
||||
RETURNING VALUE(rs_result) TYPE ty_result.
|
||||
ENDCLASS.
|
||||
|
||||
|
||||
CLASS {{p}}climb_pricer IMPLEMENTATION.
|
||||
METHOD price.
|
||||
DATA: lv_rate TYPE ty_amount,
|
||||
lv_gross TYPE ty_amount.
|
||||
|
||||
CLEAR rs_result.
|
||||
|
||||
IF is_session-entry_type = 'A' OR is_session-entry_type = 'Y' OR is_session-entry_type = 'F'.
|
||||
IF is_session-hours GE 1 AND is_session-hours LE 6.
|
||||
IF is_session-climbers GE 1 AND is_session-climbers LE 10.
|
||||
IF is_session-entry_type = 'A'.
|
||||
lv_rate = '9.00'.
|
||||
ELSEIF is_session-entry_type = 'Y'.
|
||||
lv_rate = '6.00'.
|
||||
ELSE.
|
||||
lv_rate = '7.00'.
|
||||
ENDIF.
|
||||
rs_result-base = is_session-hours * lv_rate * is_session-climbers.
|
||||
IF is_session-equipment = 'X'.
|
||||
rs_result-surcharge = is_session-climbers * '4.00'.
|
||||
ENDIF.
|
||||
IF is_session-climbers GE 6.
|
||||
rs_result-surcharge = rs_result-surcharge + '15.00'.
|
||||
ENDIF.
|
||||
lv_gross = rs_result-base + rs_result-surcharge.
|
||||
IF is_session-member = 'X'.
|
||||
rs_result-discount = lv_gross * 15 / 100.
|
||||
ELSEIF is_session-visits GE 10.
|
||||
rs_result-discount = lv_gross * 20 / 100.
|
||||
ELSEIF is_session-visits GE 3.
|
||||
rs_result-discount = lv_gross * 5 / 100.
|
||||
ENDIF.
|
||||
rs_result-total = lv_gross - rs_result-discount.
|
||||
ELSE.
|
||||
rs_result-message = 'INVALID CLIMBERS'.
|
||||
ENDIF.
|
||||
ELSE.
|
||||
rs_result-message = 'INVALID HOURS'.
|
||||
ENDIF.
|
||||
ELSE.
|
||||
rs_result-message = 'UNKNOWN ENTRY TYPE'.
|
||||
ENDIF.
|
||||
ENDMETHOD.
|
||||
ENDCLASS.
|
||||
53
tasks_gen/train/G1082/spec.md
Normal file
53
tasks_gen/train/G1082/spec.md
Normal file
@@ -0,0 +1,53 @@
|
||||
# 1. Goal
|
||||
Refactor the class {{P}}CLIMB_PRICER in package $TMP. The class calculates the
|
||||
price of a climbing session at a climbing centre. The booking program of the
|
||||
centre calls the class for each session. The class is correct today, but the
|
||||
code is hard to read and hard to change. Make the code clean and easy to
|
||||
change. The behavior must stay the same.
|
||||
|
||||
# 2. Open questions
|
||||
None.
|
||||
|
||||
# 3. Context
|
||||
- The class {{P}}CLIMB_PRICER exists in package $TMP. It is active.
|
||||
- The booking program calls the method PRICE and then reads the components of
|
||||
the result structure.
|
||||
- No user reports a wrong price. All prices are correct.
|
||||
- The implementation is one long method with deep nesting and many literal
|
||||
values. A change to one rate is risky.
|
||||
|
||||
# 4. Contract
|
||||
- Refactor the class {{P}}CLIMB_PRICER in package $TMP. The name stays the
|
||||
same.
|
||||
- The class is public and final. It has a public constructor without
|
||||
parameters.
|
||||
- The public interface must not change. It is:
|
||||
- TYPES ty_entry TYPE c LENGTH 1.
|
||||
- TYPES ty_amount TYPE p LENGTH 8 DECIMALS 2.
|
||||
- TYPES ty_session with the components entry_type TYPE ty_entry,
|
||||
hours TYPE i, climbers TYPE i, equipment TYPE abap_bool,
|
||||
member TYPE abap_bool and visits TYPE i.
|
||||
- TYPES ty_result with the components base TYPE ty_amount,
|
||||
surcharge TYPE ty_amount, discount TYPE ty_amount, total TYPE ty_amount
|
||||
and message TYPE string.
|
||||
- METHODS price IMPORTING is_session TYPE ty_session
|
||||
RETURNING VALUE(rs_result) TYPE ty_result.
|
||||
- Do not add other public methods or public types.
|
||||
|
||||
# 5. Business rules
|
||||
The legacy code contains all the rules. Read the code of {{P}}CLIMB_PRICER
|
||||
before you change it. Each input must give the same result as the legacy code.
|
||||
Keep each limit, each rate, each surcharge, each discount and each message
|
||||
text.
|
||||
|
||||
# 6. Constraints
|
||||
- Release target: 8.16.
|
||||
- Coding standards: Clean ABAP. Methods below 40 statements. No global
|
||||
variables. No magic numbers. No comment that restates the code.
|
||||
- Out of scope: do not change the public interface of {{P}}CLIMB_PRICER. 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.
|
||||
48
tasks_gen/train/G1082/task.json
Normal file
48
tasks_gen/train/G1082/task.json
Normal file
@@ -0,0 +1,48 @@
|
||||
{
|
||||
"id": "G1082",
|
||||
"category": "E",
|
||||
"object_type": "CLAS",
|
||||
"difficulty": 2,
|
||||
"release_target": "v816",
|
||||
"expected_outcome": "implement",
|
||||
"budget": {
|
||||
"max_tool_calls": 60,
|
||||
"max_activations": 15
|
||||
},
|
||||
"seed": [
|
||||
{
|
||||
"type": "CLAS",
|
||||
"name": "{{P}}CLIMB_PRICER",
|
||||
"file": "seed/climb_pricer.clas.abap",
|
||||
"description": "Legacy class that calculates the price of a climbing session"
|
||||
}
|
||||
],
|
||||
"contract": [
|
||||
{
|
||||
"type": "CLAS",
|
||||
"name": "{{P}}CLIMB_PRICER"
|
||||
}
|
||||
],
|
||||
"out_of_scope": [],
|
||||
"hidden_tests": [
|
||||
{
|
||||
"type": "CLAS",
|
||||
"name": "{{P}}CLIMB_HIDDEN",
|
||||
"file": "hidden/climb_hidden.clas.abap",
|
||||
"description": "Hidden tests that check the unchanged behavior of the refactored climbing session pricer"
|
||||
}
|
||||
],
|
||||
"reference": [
|
||||
{
|
||||
"type": "CLAS",
|
||||
"name": "{{P}}CLIMB_PRICER",
|
||||
"file": "reference/climb_pricer.clas.abap",
|
||||
"description": "Refactored climbing session price class",
|
||||
"testclasses_file": "reference/climb_pricer.testclasses.abap"
|
||||
}
|
||||
],
|
||||
"craft_checks": [
|
||||
"method_length",
|
||||
"cyclomatic_complexity"
|
||||
]
|
||||
}
|
||||
Reference in New Issue
Block a user