discard """
  output: '''foo
js 3.14
7
1
-21550
-21550
none(TT)
()
destroyed
destroyed
'''
"""

# This file tests the JavaScript generator

doAssert getCurrentException() == nil
doAssert getCurrentExceptionMsg() == ""

#  #335
proc foo() =
  var bar = "foo"
  proc baz() =
    echo bar
  baz()
foo()

# #376
when not defined(js):
  proc foo(val: float): string = "no js " & $val
else:
  proc foo(val: float): string = "js " & $val

echo foo(3.14)

# #2495
type C = concept x

proc test(x: C, T: typedesc): T =
  cast[T](x)

echo 7.test(int8)

# #4222
const someConst = [ "1"]

proc procThatRefersToConst() # Forward decl
procThatRefersToConst() # Call bar before it is defined

proc procThatRefersToConst() =
  var i = 0 # Use a var index, otherwise nim will constfold foo[0]
  echo someConst[i] # JS exception here: foo is still not initialized (undefined)

# bug #6753
let x = -1861876800
const y = 86400
echo (x - (y - 1)) div y # Now gives `-21550`

proc foo09() =
    let x = -1861876800
    const y = 86400
    echo (x - (y - 1)) div y # Still gives `-21551`
foo09()

import std/options

type TT = object

proc `=destroy`(x: TT) = echo "destroyed"

func test1: Option[TT] = discard
func test2: TT = discard

echo test1() # Crash in JS backend, not crash in C backend
echo test2() # Not crash
