mirror of
				https://github.com/KevinMidboe/linguist.git
				synced 2025-10-29 17:50:22 +00:00 
			
		
		
		
	
		
			
				
	
	
		
			170 lines
		
	
	
		
			2.5 KiB
		
	
	
	
		
			Crystal
		
	
	
	
	
	
			
		
		
	
	
			170 lines
		
	
	
		
			2.5 KiB
		
	
	
	
		
			Crystal
		
	
	
	
	
	
| #!/usr/bin/env bin/crystal --run
 | |
| require "../../spec_helper"
 | |
| 
 | |
| describe "Codegen: const" do
 | |
|   it "define a constant" do
 | |
|     run("A = 1; A").to_i.should eq(1)
 | |
|   end
 | |
| 
 | |
|   it "support nested constant" do
 | |
|     run("class B; A = 1; end; B::A").to_i.should eq(1)
 | |
|   end
 | |
| 
 | |
|   it "support constant inside a def" do
 | |
|     run("
 | |
|       class Foo
 | |
|         A = 1
 | |
| 
 | |
|         def foo
 | |
|           A
 | |
|         end
 | |
|       end
 | |
| 
 | |
|       Foo.new.foo
 | |
|     ").to_i.should eq(1)
 | |
|   end
 | |
| 
 | |
|   it "finds nearest constant first" do
 | |
|     run("
 | |
|       A = 1
 | |
| 
 | |
|       class Foo
 | |
|         A = 2.5_f32
 | |
| 
 | |
|         def foo
 | |
|           A
 | |
|         end
 | |
|       end
 | |
| 
 | |
|       Foo.new.foo
 | |
|     ").to_f32.should eq(2.5)
 | |
|   end
 | |
| 
 | |
|   it "allows constants with same name" do
 | |
|     run("
 | |
|       A = 1
 | |
| 
 | |
|       class Foo
 | |
|         A = 2.5_f32
 | |
| 
 | |
|         def foo
 | |
|           A
 | |
|         end
 | |
|       end
 | |
| 
 | |
|       A
 | |
|       Foo.new.foo
 | |
|     ").to_f32.should eq(2.5)
 | |
|   end
 | |
| 
 | |
|   it "constants with expression" do
 | |
|     run("
 | |
|       A = 1 + 1
 | |
|       A
 | |
|     ").to_i.should eq(2)
 | |
|   end
 | |
| 
 | |
|   it "finds global constant" do
 | |
|     run("
 | |
|       A = 1
 | |
| 
 | |
|       class Foo
 | |
|         def foo
 | |
|           A
 | |
|         end
 | |
|       end
 | |
| 
 | |
|       Foo.new.foo
 | |
|     ").to_i.should eq(1)
 | |
|   end
 | |
| 
 | |
|   it "define a constant in lib" do
 | |
|     run("lib Foo; A = 1; end; Foo::A").to_i.should eq(1)
 | |
|   end
 | |
| 
 | |
|   it "invokes block in const" do
 | |
|     run("require \"prelude\"; A = [\"1\"].map { |x| x.to_i }; A[0]").to_i.should eq(1)
 | |
|   end
 | |
| 
 | |
|   it "declare constants in right order" do
 | |
|     run("A = 1 + 1; B = true ? A : 0; B").to_i.should eq(2)
 | |
|   end
 | |
| 
 | |
|   it "uses correct types lookup" do
 | |
|     run("
 | |
|       module A
 | |
|         class B
 | |
|           def foo
 | |
|             1
 | |
|           end
 | |
|         end
 | |
| 
 | |
|         C = B.new;
 | |
|       end
 | |
| 
 | |
|       def foo
 | |
|         A::C.foo
 | |
|       end
 | |
| 
 | |
|       foo
 | |
|       ").to_i.should eq(1)
 | |
|   end
 | |
| 
 | |
|   it "codegens variable assignment in const" do
 | |
|     run("
 | |
|       class Foo
 | |
|         def initialize(@x)
 | |
|         end
 | |
| 
 | |
|         def x
 | |
|           @x
 | |
|         end
 | |
|       end
 | |
| 
 | |
|       A = begin
 | |
|             f = Foo.new(1)
 | |
|             f
 | |
|           end
 | |
| 
 | |
|       def foo
 | |
|         A.x
 | |
|       end
 | |
| 
 | |
|       foo
 | |
|       ").to_i.should eq(1)
 | |
|   end
 | |
| 
 | |
|   it "declaring var" do
 | |
|     run("
 | |
|       BAR = begin
 | |
|         a = 1
 | |
|         while 1 == 2
 | |
|           b = 2
 | |
|         end
 | |
|         a
 | |
|       end
 | |
|       class Foo
 | |
|         def compile
 | |
|           BAR
 | |
|         end
 | |
|       end
 | |
| 
 | |
|       Foo.new.compile
 | |
|       ").to_i.should eq(1)
 | |
|   end
 | |
| 
 | |
|   it "initialize const that might raise an exception" do
 | |
|     run("
 | |
|       require \"prelude\"
 | |
|       CONST = (raise \"OH NO\" if 1 == 2)
 | |
| 
 | |
|       def doit
 | |
|         CONST
 | |
|       rescue
 | |
|       end
 | |
| 
 | |
|       doit.nil?
 | |
|     ").to_b.should be_true
 | |
|   end
 | |
| end
 |