%%
%% %CopyrightBegin%
%%
%% SPDX-License-Identifier: Apache-2.0
%%
%% Copyright Ericsson AB 2005-2025. All Rights Reserved.
%%
%% Licensed under the Apache License, Version 2.0 (the "License");
%% you may not use this file except in compliance with the License.
%% You may obtain a copy of the License at
%%
%%     http://www.apache.org/licenses/LICENSE-2.0
%%
%% Unless required by applicable law or agreed to in writing, software
%% distributed under the License is distributed on an "AS IS" BASIS,
%% WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
%% See the License for the specific language governing permissions and
%% limitations under the License.
%%
%% %CopyrightEnd%
%%
-module(otp_5632).
-export([?MODULE/0]).
-export([pstnproxy_add_headers/2,macosx_workaround/0,fast_cut/3,test/1,test2/1,
	 create_int_jumper_cables/1]).

-import(lists, [foldl/3,last/1,member/2,reverse/1,reverse/2,seq/2,sort/1]).

?MODULE() ->
    ok.

-record(request, {
	  header
	 }).


-record(siporigin, {
	  proto
	 }).


%% Test a problem in beam_jump.erl.
pstnproxy_add_headers(Request, Origin) when is_record(Request, request),
                                            is_record(Origin, siporigin) ->
    NewHeaders1 = Request#request.header,
    NewHeaders2 =
        case (Origin#siporigin.proto == tls) or (Origin#siporigin.proto == tls6) of
            true ->
		keylist:delete("X-Foo2", NewHeaders1);
	    false ->
                keylist:delete("X-Foo2", NewHeaders1)
        end,
    NewHeaders3 =
      case (Origin#siporigin.proto == tls) or (Origin#siporigin.proto == tls6) of
          true ->
              keylist:delete("X-Foo3", NewHeaders2);
          false ->
              keylist:delete("X-Foo3", NewHeaders2)
      end,
    Request#request{header = NewHeaders3}.

%% Test a problem in beam_validator.erl.
macosx_workaround() ->
    try 1.0/zero()
    catch
	error:_ -> ok
    end.

zero() -> 0.0.

-record(we, {id,
             perm = 0,
             name,
             es,
             fs,
             he,
             vc,
             vp,
             mat = default,
             next_id,
             mode,
             mirror = none,
             light = none,
             has_shape = true}).

-record(edge, {vs,
               ve,
               a = none,
               b = none,
               lf,
               rf,
               ltpr,
               ltsu,
               rtpr,
               rtsu}).


fast_cut(Edge,Pos0,We0) ->
    {NewEdge = NewV,We} = wings_we:new_ids(1,We0),
    #we{es = Etab0,
        vc = Vct0,
        vp = Vtab0,
        he = Htab0} = We,
    Template = gb_trees:get(Edge,Etab0),
    #edge{vs = Vstart,
          ve = Vend,
          a = ACol,
          b = BCol,
          lf = Lf,
          rf = Rf,
          ltpr = EdgeA,
          rtsu = EdgeB,
          rtpr = NextBCol} = Template,
    VendPos = gb_trees:get(Vend,Vtab0),
    Vct1 = gb_trees:update(Vend,NewEdge,Vct0),
    VstartPos = wings_vertex:pos(Vstart,Vtab0),
    if
        Pos0 =:= default ->
            NewVPos0 = e3d_vec:average([VstartPos,VendPos]);
        true ->
            NewVPos0 = Pos0
    end,
    NewVPos = wings_util:share(NewVPos0),
    Vct = gb_trees:insert(NewV,NewEdge,Vct1),
    Vtab = gb_trees:insert(NewV,NewVPos,Vtab0),
    AColOther = ?MODULE:get_vtx_color(EdgeA,Lf,Etab0),
    BColOther = ?MODULE:get_vtx_color(NextBCol,Rf,Etab0),
    Weight = if
                 Pos0 == default ->
                     0.500000;
                 true ->
                     ADist = e3d_vec:dist(Pos0,VstartPos),
                     BDist = e3d_vec:dist(Pos0,VendPos),
                     try
                         ADist / (ADist + BDist)
                     catch
                         error:badarith ->
                             0.500000
                     end
             end,
    NewColA = wings_color:mix(Weight,AColOther,ACol),
    NewColB = wings_color:mix(Weight,BCol,BColOther),
    NewEdgeRec = Template#edge{vs = NewV,
                               a = NewColA,
                               ltsu = Edge,
                               rtpr = Edge},
    Etab1 = gb_trees:insert(NewEdge,NewEdgeRec,Etab0),
    Etab2 = ?MODULE:patch_edge(EdgeA,NewEdge,Edge,Etab1),
    Etab3 = ?MODULE:patch_edge(EdgeB,NewEdge,Edge,Etab2),
    EdgeRec = Template#edge{ve = NewV,
                            b = NewColB,
                            rtsu = NewEdge,
                            ltpr = NewEdge},
    Etab = gb_trees:update(Edge,EdgeRec,Etab3),
    Htab = case gb_sets:is_member(Edge,Htab0) of
               false ->
                   Htab0;
               true ->
                   gb_sets:insert(NewEdge,Htab0)
           end,
    {We#we{es = Etab,
           vc = Vct,
           vp = Vtab,
           he = Htab},NewV}.

%% A problem in beam_bool.

-record(a, {a,b,c}).

test(As) ->
     case As of
     A when A#a.b == []; A#a.b == undefined ->
         true;
     _ ->
         false
     end.

test2(As) ->
     case As of
     A when A#a.b == {a,b,c}; A#a.b == undefined ->
         true;
     _ ->
         false
     end.

%% Record updating problems.

-record(int_jumper_cable, {id,
                           connectionFieldRef,
                           aiuPlugInUnitRef,
                           connFieldConnector,
                           aiuConnector,
                           dlAttenuation = 1,
                           ulAttenuation = 1,
                           electricalDlDelay = 100,
                           electricalUlDelay = 100,
                           optionals = []}).

create_int_jumper_cables(_Config) ->
    ct_line:line({{ccl_setup_SUITE,create_int_jumper_cables},637}),
    ct:comment("Create IntJumperCable MO"),
    ct_line:line({{ccl_setup_SUITE,create_int_jumper_cables},639}),
    Parent = "ManagedElement=1,Equipment=1",
    ct_line:line({{ccl_setup_SUITE,create_int_jumper_cables},641}),
    I1 = #int_jumper_cable{id = 1,
                           connectionFieldRef = Parent ++ ",ConnectionField=1",
                           aiuPlugInUnitRef = Parent ++ ",Subrack=2,Slot=6,PlugInUnit=1",
                           connFieldConnector = "J1",
                           aiuConnector = 1},
    ct_line:line({{ccl_setup_SUITE,create_int_jumper_cables},650}),
    I2 = I1#int_jumper_cable{id = 2,
                             connFieldConnector = "H1",
                             aiuConnector = 2},
    ct_line:line({{ccl_setup_SUITE,create_int_jumper_cables},657}),
    I3 = I1#int_jumper_cable{id = 3,
                             aiuPlugInUnitRef = Parent ++ ",Subrack=2,Slot=9,PlugInUnit=1",
                             connFieldConnector = "J2"},
    ct_line:line({{ccl_setup_SUITE,create_int_jumper_cables},663}),
    I4 = I3#int_jumper_cable{id = 4,
                             connFieldConnector = "H2",
                             aiuConnector = 2},
    ct_line:line({{ccl_setup_SUITE,create_int_jumper_cables},670}),
    I5 = I1#int_jumper_cable{id = 5,
                             aiuPlugInUnitRef = Parent ++ ",Subrack=2,Slot=12,PlugInUnit=1",
                             connFieldConnector = "J3"},
    ct_line:line({{ccl_setup_SUITE,create_int_jumper_cables},677}),
    I6 = I5#int_jumper_cable{id = 6,
                             connFieldConnector = "H3",
                             aiuConnector = 2},
    ct_line:line({{ccl_setup_SUITE,create_int_jumper_cables},684}),
    [_MO1,_MO2,_MO3,_MO4,_MO5,_MO6] = mub_util:create(mp_mub,Parent,[I1,I2,I3,I4,I5,I6]),
    ct_line:line({{ccl_setup_SUITE,create_int_jumper_cables},686}),
    ok.
