# Test file for Julia

# Comment

<beginfold id='1'>#=</beginfold id='1'> Multi-line
   comment <endfold id='1'>=#</endfold id='1'>

<beginfold id='2'>#BEGIN</beginfold id='2'>

<endfold id='2'>#END</endfold id='2'>

using Random, LinearAlgebra
x = 1 + 1
using DataFrames, Tables,   
    HDF5, # this is a comment
    Plots
using DataFrames, Tables,
    
    # this is a comment
    Plots
x = x ± 2
using SparseArrays: SparseMatrixCSC
using Sockets: Sockets, connect,
    listen,
    getaddrinfo
x = x^3
using Statistics:
    std,
    stdm

<beginfold id='3'>"""</beginfold id='3'>
 Multi-line string
<endfold id='3'>"""</endfold id='3'>
<beginfold id='3'>```</beginfold id='3'>
 Multi-line command
<endfold id='3'>```</endfold id='3'>
raw"string\a\\a"

"string $testvar interpolation"
"string \$testvar interpolation"
"string $(collect(1:10) .^ 3) interpolation"
"string \$(collect(1:10) .^ 3) interpolation"

<beginfold id='4'>let</beginfold id='4'> z = zip(1:2, 3:4, 5:6)
    @test size(z) == (2,)
    @test collect(z) == [(1,3,5), (2,4,6)]
    @test eltype(z) == Tuple{Int,Int,Int}
<endfold id='4'>end</endfold id='4'>

@testset "generic conversion from Integer" <beginfold id='4'>begin</beginfold id='4'>
    x = rand(Int128)
    @test BigInt(x) % Int128 === x
    y = rand(UInt128)
    @test BigInt(y) % UInt128 === y
<endfold id='4'>end</endfold id='4'>

@testset "show" <beginfold id='4'>begin</beginfold id='4'>
    @test sprint(show, BitSet()) == "BitSet([])"
    @test sprint(show, BitSet([1,2,3])) == "BitSet([1, 2, 3])"
    show(IOBuffer(), BitSet())
<endfold id='4'>end</endfold id='4'>

cmd = `$(Base.julia_cmd()) --depwarn=error --startup-file=no boundscheck_exec.jl`
<beginfold id='4'>if</beginfold id='4'> !success(pipeline(cmd; stdout=stdout, stderr=stderr))
    error("boundscheck test failed, cmd : $cmd")
<endfold id='4'>end</endfold id='4'>

@test iterate(I, CartesianIndex(3, typemax(Int)))[1] == CartesianIndex(4,typemax(Int))
@test iterate(I, CartesianIndex(4, typemax(Int)))    === nothing
@test_throws MethodError write(IOBuffer(), ASCIIChar('x'))
@test_throws MethodError read(IOBuffer('x'), ASCIIChar)

<beginfold id='4'>let</beginfold id='4'> header = "julia [switches] -- [programfile] [args...]"
    @test startswith(read(`$exename -h`, String), header)
    @test startswith(read(`$exename --help`, String), header)
<endfold id='4'>end</endfold id='4'>

@test isequal(exp(complex( Inf, NaN)), complex(-Inf, NaN))
@test isequal(exp(complex( Inf, Inf)), complex(-Inf, NaN))

# Numbers
0b10
0o01_70
0x00000000000000001111__22_2233334444
-0x0002im
1.0e10
0.00025f0
-1.5__5f0
0xdeadbeefim
0x1.8p3
0x.4p-1

chars = ['0', '1', '2', '3', 'a', 'b', 'c', 'd', 'e', 'X', 'Y', 'Z',
         '𠀋', '𠀌', '𠀍', '🂠', '🂡', '🂢', '🂣', '🂮']

@test docstrings_equal(@doc(ModuleMacroDoc), doc"I am a module")
match(r"^\s*(?:#|$)", "# a comment")

<beginfold id='4'>abstract type</beginfold id='4'> Test2 <endfold id='4'>end</endfold id='4'>

<beginfold id='4'>function</beginfold id='4'> ∇abc∇def(a::Int,
                 b:: Int,
                 c::Dict{String, Int},
                 d:: Dict{String, Vector{eltype(var1)}},
                 f::AbstractVector{<:Number},
                 g::T,
                 h::T) where {T <: Number}
    x::Int = 1
    z = collect(1:10)
    return z[3:end] .+ x .- a
<endfold id='4'>end</endfold id='4'>

<beginfold id='4'>mutable struct</beginfold id='4'> TestType <: AbstractVector{Number}
    field1::Int
    ∇field2::Vector
<endfold id='4'>end</endfold id='4'>

<beginfold id='4'>struct</beginfold id='4'> ParametricType{T, V <: Tuple}
    field1
    field2::Float

    <beginfold id='4'>function</beginfold id='4'> ParametricType{T, V}(r, d) where {T, V <: Tuple}
        return new{T, V}(r, d)
    <endfold id='4'>end</endfold id='4'>
<endfold id='4'>end</endfold id='4'>
