# UnitCommitment.jl: Optimization Package for Security-Constrained Unit Commitment
# Copyright (C) 2020, UChicago Argonne, LLC. All rights reserved.
# Released under the modified BSD license. See COPYING.md for more details.

using UnitCommitment, JSON, GZip, DataStructures

parse_case14() = JSON.parse(GZip.gzopen("../instances/test/case14.json.gz"),
                            dicttype=()->DefaultOrderedDict(nothing))

@testset "Validation" begin
    @testset "fix!" begin
        
        @testset "Cost curve should be convex" begin
            json = parse_case14()
            json["Generators"]["g1"]["Production cost curve (MW)"] = [100, 150, 200]
            json["Generators"]["g1"]["Production cost curve (\$)"] = [10, 25, 30]
            instance = UnitCommitment.from_json(json, fix=false)
            @test UnitCommitment.fix!(instance) == 4
        end
        
        @testset "Startup limit must be greater than Pmin" begin
            json = parse_case14()
            json["Generators"]["g1"]["Production cost curve (MW)"] = [100, 150]
            json["Generators"]["g1"]["Production cost curve (\$)"] = [100, 150]
            json["Generators"]["g1"]["Startup limit (MW)"] = 80
            instance = UnitCommitment.from_json(json, fix=false)
            @test UnitCommitment.fix!(instance) == 1
        end
        
        @testset "Startup costs and delays must be increasing" begin
            json = parse_case14()
            json["Generators"]["g1"]["Startup costs (\$)"] = [300, 200, 100]
            json["Generators"]["g1"]["Startup delays (h)"] = [8, 4, 2]
            instance = UnitCommitment.from_json(json, fix=false)
            @test UnitCommitment.fix!(instance) == 4
        end

    end
end
